Меня интересовало чтобы было 234,00 или 123,40. За скрипт спасибо, интересно.05.12.11 01:15 Число просмотров: 2646 Автор: Fighter <Vladimir> Статус: Elderman Отредактировано 05.12.11 01:18 Количество правок: 1
Я это обошел на стороне сервера. Если в строке не обнаружено десятичной запятой (точки) или после запятой всего один знак, то в строку дописывается '',00 или '0' соответственно. Просто мне стало интересно, есть ли в php штатная функция, которая завершает строку с числом нужным количеством нулей после запятой. Вспомнилось, как когда-то, не зная про explode, я написал свою аналог)
В каком смысле с завершающими нулями? Грубо говоря на входе 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>
Бывает) Кстати для того, что ты подумал есть отличный класс NumToText. Не помню только где я его взял.08.12.11 04:45 Автор: Fighter <Vladimir> Статус: Elderman