Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5

Простой php класс который преобразовывает число в строковой еквивалент

31.12.2012, 20:29. Показов 784. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например число 2355 в two thousands three hundreds fifty five. Диапазон чисел от нуля до одного миллиарда, язык строкового представления чисел - Английский. Исходный код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
 
# This class present numerical symbols to string equivalent
 
class DigitsInWords {
 
    var $units = array(
        0 => 'zero',  1 => 'one', 
        2 => 'two',   3 => 'three', 
        4 => 'four',  5 => 'five', 
        6 => 'six',   7 => 'seven', 
        8 => 'eight', 9 => 'nine' ) ;
 
    var $superunits = array(
        10 => 'ten',      11 => 'eleven', 
        12 => 'twelve',   13 => 'thirteen', 
        14 => 'fourteen', 15 => 'fifteen', 
        16 => 'sixteen',  17 => 'seventeen', 
        18 => 'eighteen', 19 => 'nineteen' ) ;
 
    var $tens = array(
        2 => 'twenty', 3 => 'thirty', 
        4 => 'fourty', 5 => 'fifty', 
        6 => 'sixty',  7 => 'seventy', 
        8 => 'eighty', 9 => 'ninety' ) ;
 
    var $powermode = array(
        3 => 'thousand', 
        6 => 'million', 
        9 => 'milliard' );
 
    var $out ;
    
    # Call it method for convert digits
    function letsSee($digit) {
        # Inner data format check
        if( !preg_match('/\A\d{0,12}\Z/', $digit) ) {
            return ' error. unknown format or out of range ' ;
        }
        # Complette dig. string and split it at four triplex parts, accord to powermode types
        preg_match('/(...)(...)(...)(...)/', str_repeat('0', 12-strlen($digit)).$digit, $matches) ;
        # Parse all of one parts
        foreach( $matches as $key => $triplex ) {
            # Skip zero elem
            if( $key > 0 ) {
                # Additional
                $triplex = intval($triplex);
                # Most zero?
                if( $triplex > 0 ) {
                    # No. Power mode less one thousand?
                    if( $key < 4 ) {
                        # No, powerstring index calc.
                        $powerstring = $this->powermode[12-$key*3] ;
                        # Lang suffix setup
                        $powerstring = $triplex > 1 ? $powerstring.'s' : $powerstring ;
                    } else {
                        # Yes, it empty
                        $powerstring = '' ;
                    }
                    # Assemble on of four part
                    $this->out .= $this->from_Zero_to_nnn($triplex) . " $powerstring " ;
                }
            }
        }
        # Rotate vars
        $out = $this->out ;
            # Destruct
               $this->out = '' ;
        # Trim last spaces. Out.
        return rtrim($out, ' ') ;
    }
    
    # This present digits from zero to ninety nine
    function from_Zero_to_nn($digits) {
            $digits = intval($digits);
        if( $digits == 0 ) {
            return '' ;
        } else if( $digits > 0 && $digits <= 9 ) {
            return $this->units[$digits];
        } else if( $digits >= 10 && $digits <= 19 ) {
            return $this->superunits[$digits] ;
        } else if ( $digits == 20 ) {
            return 'twenty' ;
        } else {
             $firstbit = substr($digits, 0, 1) ;
            $secondbit = substr($digits, 1, 1) ;
            return $this->tens[$firstbit].( $secondbit == 0 ? '' : ' '.$this->units[$secondbit] );
        }
    }
    
    # This present digits from zero to nine hundreds ninety nine
    function from_Zero_to_nnn($digits) {
            $digits = intval($digits);
        if( $digits == 0 ) {
            return '' ;
        } else if( $digits > 0 && $digits <= 99 ) {
            return $this->from_Zero_to_nn($digits) ;
        } else {
             $firstbit = substr($digits, 0, 1) ;
             $nextbits = substr($digits, 1, 1).substr($digits, 2, 1) ;
             $hundreds = $this->units[$firstbit] . ( $firstbit > 1 ? ' hundreds' : ' hundred' ) ;
            $restparts = $this->from_Zero_to_nn($nextbits);
            return "$hundreds " . ( $nextbits >= 1 && $nextbits <= 9 ? "and $restparts" : $restparts ) ;
        }
    }
}
 
# Test it
$DinW = new DigitsInWords ;
 
# Lets see 2355
echo $DinW->letsSee(2355);
 
?>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.12.2012, 20:29
Ответы с готовыми решениями:

Создать класс, который имеет параметризованный метод, который рассчитывает, простое ли число
Создать класс, который имеет параметризованный метод, который рассчитывает, простое ли число.

По каким правилам MS SQL преобразовывает число в datetime?
Число 37986 получается в VB из строки кодом: CDec(DateValue('31.12.03')) (Кстати CDec(DateValue('31.12.2003')) - тоже дает 37986) (Еще...

написать такой класс, который представляет собой двоичное число
не могу справиться вот с этим: написать такой класс, который представляет собой двоичное число. биты держит в виде объекта std::vector...

9
 Аватар для c4boomb
198 / 166 / 23
Регистрация: 20.04.2011
Сообщений: 750
Записей в блоге: 1
31.12.2012, 20:39
Это для тестирования? Тогда лучше в Бета тестирование перенести.
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
01.01.2013, 03:13  [ТС]
Это для тестирования?
какого тестирования?
Тогда лучше в Бета тестирование перенести
переносите

Добавлено через 6 часов 11 минут
класс можно немного переделать под Русский вывод, и использовать в своих проектах, например "Сегодня наш сайт посетило восемь тысяч один пользователь" В классе могут быть не значительные ошибки, но в основном
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
01.01.2013, 08:07
Цитата Сообщение от tolimadokara Посмотреть сообщение
класс можно немного переделать под Русский вывод
А ничего, что русский и английский языки немного отличаются?

nEngРус
1 000one thousandодна тысяча
2 000two thousandsдве тысячи
5 000five thousandsпять тысяч
21 000twenty one thousandsдвадцать одна тысяча

Переделать, действительно, можно, но первые действия будут: "выделить всё" и "удалить".


tolimadokara, Вы хотите произвести на кого-то впечатление? Какой толк выкладывать на обозрение какую-то копипасту, тем более забугорную? Помогайте нуждающимся в решении их проблем - будет больше толку.
1
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
01.01.2013, 11:43  [ТС]
А ничего, что русский и английский языки немного отличаются?
ничего
первые действия будут: "выделить всё"
первые действия это изменения языковых переменных класса
tolimadokara, Вы хотите произвести на кого-то впечатление?
вообще, понимаете, основная страница www.cyberforum.ru - производит впечатление
Какой толк выкладывать на обозрение какую-то копипасту, тем более забугорную?
Vovan-VE, вы - не Штирлиц это мой код
0
01.01.2013, 16:27

Не по теме:

а зачем здесь вообще класс? :scratch:
к тому же, вопрос - Вы когда писали этот код? Он заточен под PHP 4, уже давно PHP 5.

0
01.01.2013, 16:39  [ТС]

Не по теме:

а зачем здесь вообще класс?
зачем этот топик в разделе форума PHP для начинающих? надо было сделать не классом а функцией?
Вы когда писали этот код?
в прошлом году
Он заточен под PHP 4, уже давно PHP 5
я его под конкретную версию PHP не затачивал, просто взял и написал. У меня на локальном веб сервере стоит PHP 5 и все прекрасно работает. Что же там такое есть чего нет в PHP 4? Там строковые функции, регулярные выражения и ООП, и все

0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
02.01.2013, 07:08
Цитата Сообщение от tolimadokara Посмотреть сообщение
первые действия это изменения языковых переменных класса
Вы это уже делали? Получиться либо так:
  • 2 тысячи
  • 5 тысячи
  • 21 тысячи
Либо так:
  • 2 тысяч
  • 5 тысяч
  • 21 тысяч
0
 Аватар для shafl
258 / 147 / 37
Регистрация: 24.01.2011
Сообщений: 427
02.01.2013, 13:22
на хабре как то видел, только тут ещё рубли-копейки дописываются:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function num2str($inn, $stripkop=false) {
    $nol = 'ноль';
    $str[100]= array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот', 'восемьсот','девятьсот');
    $str[11] = array('','десять','одиннадцать','двенадцать','тринадцать', 'четырнадцать','пятнадцать','шестнадцать','семнадцать', 'восемнадцать','девятнадцать','двадцать');
    $str[10] = array('','десять','двадцать','тридцать','сорок','пятьдесят', 'шестьдесят','семьдесят','восемьдесят','девяносто');
    $sex = array(
        array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
        array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять')
    );
    $forms = array(
        array('копейка',  'копейки',   'копеек',     1), 
        array('рубль',    'рубля',     'рублей',     0), 
        array('тысяча',   'тысячи',    'тысяч',      1), 
        array('миллион',  'миллиона',  'миллионов',  0), 
        array('миллиард', 'миллиарда', 'миллиардов', 0), 
        array('триллион', 'триллиона', 'триллионов', 0), 
    );
    $out = $tmp = array();
    $tmp = explode('.', str_replace(',','.', $inn));
    $rub = number_format($tmp[0],0,'','-');
    if ($rub==0) $out[] = $nol; 
    $kop = isset($tmp[1]) ? substr(str_pad($tmp[1], 2, '0', STR_PAD_RIGHT),0,2) : '00';
    $segments = explode('-', $rub);
    $offset = sizeof($segments);
    if ((int)$rub==0) { 
        $o[] = $nol;
        $o[] = morph(0, $forms[1][0],$forms[1][1],$forms[1][2]);
    }
    else {
        foreach ($segments as $k=>$lev) {
            $sexi= (int) $forms[$offset][3]; 
            $ri  = (int) $lev; 
            if ($ri==0 && $offset>1) {
                $offset--;
                continue;
            }
$ri = str_pad($ri, 3, '0', STR_PAD_LEFT);
$r1 = (int)substr($ri,0,1);
            $r2 = (int)substr($ri,1,1);
            $r3 = (int)substr($ri,2,1);
            $r22= (int)$r2.$r3; 
if ($ri>99) $o[] = $str[100][$r1];
            if ($r22>20) {
                $o[] = $str[10][$r2];
                $o[] = $sex[ $sexi ][$r3];
            }
            else {
                if ($r22>9) $o[] = $str[11][$r22-9];
                elseif($r22>0)  $o[] = $sex[ $sexi ][$r3];
            }
            $o[] = morph($ri, $forms[$offset][0],$forms[$offset][1],$forms[$offset][2]);
            $offset--;
        }
    }
    if (!$stripkop) {
        $o[] = $kop;
        $o[] = morph($kop,$forms[0][0],$forms[0][1],$forms[0][2]);
    }
    return preg_replace("/\s{2,}/",' ',implode(' ',$o));
}
 
function morph($n, $f1, $f2, $f5) {
    $n = abs($n) % 100;
    $n1= $n % 10;
    if ($n>10 && $n<20) return $f5;
    if ($n1>1 && $n1<5) return $f2;
    if ($n1==1)     return $f1;
    return $f5;
}
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
02.01.2013, 13:45  [ТС]
на хабре как то видел, только тут ещё рубли-копейки дописываются
спасибо шафл, такое часто в банковском софте применяют
Вован-VE, я как то не думал что для русского вывода класс DigitsInWords надо значительно переделывать, но то что вы написали конечно - верно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.01.2013, 13:45
Помогаю со студенческими работами здесь

Создать метод, который вырезает из строковой переменной цифры
Помогите пожалуйста, нужно создать метод, который вырезает из строковой переменной цифры

Создать класс, который хранит целое десятичное число без знака
Други и подруги, прошу вашей помощи! Вот такую программу нужно написать, есть такие, кто может помочь? Создать класс, который...

Создать класс, который считывает десятичное число и печатает его 2-ый, 8-ый и 16-ый эквивалент
Задача в названии темы, за любую помощь буду премного благодарен.

Написать класс Binary, который инкрементирует число, записанное в 2-чном виде
Написать класс Binary, который инкрементирует число, записанное в 2-чном виде. Допускаются только числа больше нуля. Ведущих нулей в числе...

Создать класс Binary1, который будет содержать число в двоичной системе
1.Поле first – целое число, целая часть числа, записанного в восьмеричной системе счисления; поле second – положительное целое число,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru