информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяГде водятся OGRыСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Как обычно, вопрос оказался проще, чем я думал ) 05.12.11 02:33  Число просмотров: 2691
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
<programming>
Есть в php штатный способ превратить число в строку с завершающими нулями? 03.12.11 23:58  
Автор: Fighter <Vladimir> Статус: Elderman
<"чистая" ссылка>
В каком смысле с завершающими нулями? Грубо говоря на входе 234, а надо указывать тыщи? Если да, то прямых решений не вижу кроме. 1) intval 2) while (len < needed) result .='0'; Хотя... дочитай. 04.12.11 23:22  
Автор: kstati <Евгений Борисов> Статус: Elderman
Отредактировано 05.12.11 00:24  Количество правок: 15
<"чистая" ссылка>
Если вопрос с сайтами в которых указываются суммы, то пригодится моё решение.

Сам подобную фишку в магазинчике внедрял - заставлял пользователя указывать сумму в тысячах только цифрами. Лови кусок яваскрипта, может идея пригодится.
Мой выбор - посадить обработчика на инпут, чуть ниже дать пустой div и в нём наглядно писать что будет принимать система (onkeyup= CleanUpPriceField(this); parseIntToString(this.value, targetdiv)) . Проколов от пользователей в таком случае ещё не было. А откровенно заниженные цены рублю как недостоверные на стороне php и не парюсь.
keyUp выбрал, а не Change ибо некоторые браузеры вызывают onChange только при нажатии в поле Enter либо потери фокуса - например хром.

<head>
<script>
/** преобразует триаду цифр в слова с нужным суффиксом
На входе цифровое значение и
три суффикса: для одиночного значения, 
от двух-до четырёх
Более четырёх 

!внимание, для экономии времени применён небольшой финт ушами. 
Единицы измерения 1,2 разные в зависимости от рода. 
Для простоты примера считаю, что всё, что заканчивается на "а" - женского рода 
- тысяча, рубль, миллион.
*/
function  TriadToWords(value, txtOne, txt234, txtMore) {
    var result=Array();
    var suffix=txtMore;
    var isFemail = (txtOne.substr(-1,1) == 'а');
    var isNeedToParce01=false;
    switch (value.substr(0,1)){
        case "1": result[0] = "сто"; break;
        case "2": result[0] = "двести"; break;
        case "3": result[0] = "триста"; break;
        case "4": result[0] = "четыреста"; break;
        case "5": result[0] = "пятьсот"; break;
        case "6": result[0] = "шестьсот"; break;
        case "7": result[0] = "семьсот"; break;
        case "8": result[0] = "восемьсот"; break;
        case "9": result[0] = "девятьсот"; break;        
    }
 
    switch(value.substr(1,2) ) {
            case '10': result[1]="десять"; break;
            case '11': result[1]="одиннадцать"; break;
            case '12': result[1]="двенадцать";  break;
            case '13': result[1]="тринадцать"; break;
            case '14': result[1]="четырнадцать";  break;
            case '15': result[1]="пятнадцать";  break;
            case '16': result[1]="шестнадцать"; break;
            case '17': result[1]="семнадцать"; break;
            case '18': result[1]="восемнадцать"; break;
            case '19': result[1]="девятнадцать";  break;
           
            default:
                isNeedToParce01=true;
    }
    
    if (isNeedToParce01) {
        switch (value.substr (1,1) ) {
            case '2': result[2]="двадцать";   break;
            case '3': result[2]="тридцать";  break;
            case '4': result[2]="сорок";  break;
            case '5': result[2]="пятьдесят";  break;
            case '6': result[2]="шестьдесят";  break;
            case '7': result[2]="семьдесят";  break;
            case '8': result[2]="восемьдесят";  break;
            case '9': result[2]="девяносто";  break;            
        }
        
        switch ( value.substr(2,1) ) {
            case '1': result[3]=isFemail ? "одна": "один"; suffix=txtOne; break;            
            case '2': result[3]=isFemail ? "две": "два"; suffix=txt234; break;
            case '3': result[3]= "три"; suffix=txt234; break;
            case '4': result[3]="четыре"; suffix=txt234;  break;
            case '5': result[3]="пять";  break;
            case '6': result[3]="шесть";  break;
            case '7': result[3]="семь";  break;
            case '8': result[3]="восемь";  break;
            case '9': result[3]="девять";  break;            
        }
        
    }
    if (result.length==0) {
		 return '';
    }
    result = result.join(" ");
    result +=' ' + suffix;
    return (result);
}
/**
Преобразует число в текстовый эквивалент суммы. В этой версии
src - исходный input.value.
target - выходной приёмник текста 
В коде вшита обработка до миллионов. Валюта - рубли. Если надо - можно допилить как душе угодно.
*/
function parseIntToString(src, target){
    var  result = document.getElementById(target);
    while (src[0] == '0') src = src.substr(1);
    var isZero=true;
    src = parseInt(src);
    src=src.toString();
    if (src == "NaN") {
        src="000";
    }
    var srcLen=src.length;
    var val = src;
    var parsed=Array();
    while (val.length %3 != 0) {
        val = "0"+val;
    }
    
    
    switch (val.length) {
        case 9:
            parsed[0] = TriadToWords(val.substr(0,3), 'миллион', "миллиона", "миллионов");
            val = val.substr(3,6);
	    isZero = false;
        case 6:
            parsed[1]= TriadToWords(val.substr(0,3), 'тысяча', "тысячи", "тысяч");
            val = val.substr(3,3);
	    isZero = false;
        case 3:
            if (val == "000") {
		if (isZero) {
	                parsed[2] =  "ноль рублей";
		} else {
		        parsed[2] =  "рублей";
		}
            } else {
                parsed[2] = TriadToWords(val, 'рубль', "рубля", "рублей");
            }
            break;
        case 0:
            parsed[0]="ноль рублей";
            break;
        default:
            parsed[0]=" <много>";
    }

    parsed=parsed.join(" ");
    result.innerHTML =  parsed;
}


/**
Исправляет значение input-а с цифрами. Цель - оставить там только цифры. 9 максимум. 
*/
function CleanUpPriceField(price_field) {
    var result= /([1-9][0-9]{0,8})/.exec(price_field.value);
    if (!result) {
        price_field.value='';
        return;
    }
    if (result.length) {
        price_field.value = result[0];
    } 
    result = parseInt(price_field.value);
    price_field.value  = (result) ? result : " ";
};
</script></head>
<body>
<input onkeyUp="javascript: CleanUpPriceField(this); parseIntToString(this.value, 'resultDiv');" /><div id='resultDiv' />

---
Меня интересовало чтобы было 234,00 или 123,40. За скрипт спасибо, интересно. 05.12.11 01:15  
Автор: Fighter <Vladimir> Статус: Elderman
Отредактировано 05.12.11 01:18  Количество правок: 1
<"чистая" ссылка>
Я это обошел на стороне сервера. Если в строке не обнаружено десятичной запятой (точки) или после запятой всего один знак, то в строку дописывается '',00 или '0' соответственно. Просто мне стало интересно, есть ли в php штатная функция, которая завершает строку с числом нужным количеством нулей после запятой. Вспомнилось, как когда-то, не зная про explode, я написал свою аналог)
sprintf c %.2f ? 05.12.11 01:50  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
Я так и знал)) Спасибо! 05.12.11 12:19  
Автор: Fighter <Vladimir> Статус: Elderman
Отредактировано 05.12.11 16:19  Количество правок: 2
<"чистая" ссылка>
Как обычно, вопрос оказался проще, чем я думал ) 05.12.11 02:33  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
Бывает) Кстати для того, что ты подумал есть отличный класс NumToText. Не помню только где я его взял. 08.12.11 04:45  
Автор: Fighter <Vladimir> Статус: Elderman
<"чистая" ссылка>
class NumToText{
var $Mant = array();
var $Expon = array();
function NumToText() {
}

function SetMant($mant) {
$this->Mant = $mant;
}

function SetExpon($expon) {
$this->Expon = $expon;
}

function DescrIdx($ins){
if(intval($ins/10) == 1)
return 2;
else{
$tmp = $ins%10;
if($tmp == 1)
return 0;
else if($tmp >= 2 && $tmp <= 4)
return 1;
else
return 2;
}
}

function DescrSot(&$in, $raz, $ar_descr, $fem = false){
$ret = '';
$conv = intval($in / $raz);
$in %= $raz;
$descr = $ar_descr[ $this->DescrIdx($conv%100) ];
if($conv >= 100){
$Sot = array('сто', 'двести', 'триста', 'четыреста', 'пятьсот',
'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
$ret = $Sot[intval($conv/100) - 1] . ' ';
$conv %= 100;
}
if($conv >= 10){
$i = intval($conv / 10);
if($i == 1){
$DesEd = array('десять', 'одиннадцать', 'двенадцать', 'тринадцать',
'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать',
'восемнадцать', 'девятнадцать' );
$ret.= $DesEd[$conv - 10] . ' ';
$ret.= $descr;
return $ret;
}
$Des = array('двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят',
'семьдесят', 'восемьдесят', 'девяносто' );
$ret .= $Des[$i - 2] . ' ';
}

$i = $conv % 10;
if($i > 0){
if( $fem && ($i==1|$i==2) ){
$Ed = array('одна', 'две');
$ret .= $Ed[$i - 1] . ' ';
}
else{
$Ed = array('один', 'два', 'три', 'четыре', 'пять',
'шесть', 'семь', 'восемь', 'девять' );
$ret .= $Ed[$i - 1] . ' ';
}
}
$ret .= $descr;
return $ret;
}

function Convert($sum){
$ret = '';
$Kop = 0;
$Rub = 0;

$sum = trim($sum);
$sum = str_replace(' ', '', $sum);

$sign = false;
if($sum[0] == '-'){
$sum = substr($sum, 1);
$sign = true;
}
$sum = str_replace(',', '.', $sum);
$Rub = intval($sum);
if (strpos($sum, '.')!==false){
list(, $Kop) = explode('.', $sum, 2);
if (strlen($Kop)>2) $Kop = substr($Kop, 0, 2);
$Kop = intval($Kop);
}
if($Rub){
if($Rub >= 1000000000)
$ret .= $this->DescrSot($Rub, 1000000000,
array('миллиард', 'миллиарда', 'миллиардов')) . ' ';
if($Rub >= 1000000)
$ret .= $this->DescrSot($Rub, 1000000,
array('миллион', 'миллиона', 'миллионов') ) . ' ';
if($Rub >= 1000)
$ret .= $this->DescrSot($Rub, 1000,
array('тысяча', 'тысячи', 'тысяч'), true) . ' ';
$ret .= $this->DescrSot($Rub, 1, $this->Mant) . ' ';
// если необходимо поднимем регистр первой буквы
// для корректно локализованных систем можно закрыть верхнюю строку
// и раскомментировать следующую (для легкости сопровождения)
//$ret[0]=mb_convert_case($ret[0],MB_CASE_TITLE,'utf-8');
//strtoupper($ret[0]);
}
if($Kop < 10)
$ret .= '0';
$ret .= $Kop . ' ' . $this->Expon[ $this->DescrIdx($Kop) ];
if($sign)
$ret = '-' . $ret;
return $ret;
}
}

class ManyToText extends NumToText{
function ManyToText(){
$this->SetMant( array('рубль', 'рубля', 'рублей') );
$this->SetExpon( array('копейка', 'копейки', 'копеек') );
}
}
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach