Динамическое отображение суммы прописью.

  • Автор темы Автор темы bsi
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

bsi

Участник
Топикстартер
Сообщения
60
Реакции
6
Привет форумчане.
Форма сделана в Live Cycle Form Designer. Поле для ввода суммы – текстовое . Все работает нормально, если разделитель дробной части ТОЧКА. Возможно ли в функцию внести изменение, чтобы разделителем могла быть и точка и запятая? Где-то на просторах инета попадалось описание подобной проблемы, но сейчас не могу найти. Может кто подскажет как решить эту проблему? Поле для ввода суммы с текстового хочу изменить на десятичное (есть такое в Live Cycle Form Designer), но проблема в том, что после потери фокуса полем сумма, даже если ставлю точку, точка меняется на запятую и при редактировании в поле сумма, синхронного обновления в поле где пропись не происходит, целая часть (рубли прописью) меняется, а дробная (копейки прописью) нет.

Код функции, если у кого нет Live Cycle Form Designer, и файл с формой прилагаю.

Всем спасибо.
Код:
 var mapNumbers = {
    0 : [2, 1, "ноль"],
    1 : [0, 2, "один", "одна"],
    2 : [1, 2, "два", "две"],
    3 : [1, 1, "три"],
    4 : [1, 1, "четыре"],
    5 : [2, 1, "пять"],
    6 : [2, 1, "шесть"],
    7 : [2, 1, "семь"],
    8 : [2, 1, "восемь"],
    9 : [2, 1, "девять"],
    10 : [2, 1, "десять"],
    11 : [2, 1, "одиннадцать"],
    12 : [2, 1, "двенадцать"],
    13 : [2, 1, "тринадцать"],
    14 : [2, 1, "четырнадцать"],
    15 : [2, 1, "пятнадцать"],
    16 : [2, 1, "шестнадцать"],
    17 : [2, 1, "семнадцать"],
    18 : [2, 1, "восемнадцать"],
    19 : [2, 1, "девятнадцать"],
    20 : [2, 1, "двадцать"],
    30 : [2, 1, "тридцать"],
    40 : [2, 1, "сорок"],
    50 : [2, 1, "пятьдесят"],
    60 : [2, 1, "шестьдесят"],
    70 : [2, 1, "семьдесят"],
    80 : [2, 1, "восемьдесят"],
    90 : [2, 1, "девяносто"],
    100 : [2, 1, "сто"],
    200 : [2, 1, "двести"],
    300 : [2, 1, "триста"],
    400 : [2, 1, "четыреста"],
    500 : [2, 1, "пятьсот"],
    600 : [2, 1, "шестьсот"],
    700 : [2, 1, "семьсот"],
    800 : [2, 1, "восемьсот"],
    900 : [2, 1, "девятьсот"]
};

var mapOrders = [
    { _Gender : true, _arrStates : ["рубль", "рубля", "рублей"] },
    { _Gender : false, _arrStates : ["тысяча", "тысячи", "тысяч"] },
    { _Gender : true, _arrStates : ["миллион", "миллиона", "миллионов"] },
    { _Gender : true, _arrStates : ["миллиард", "миллиарда", "миллиардов"] },
    { _Gender : true, _arrStates : ["триллион", "триллиона", "триллионов"] }
];

var objKop = { _Gender : false, _arrStates : ["копейка", "копейки", "копеек"] };

function Value(dVal, bGender) {
    var xVal = mapNumbers[dVal];
    if (xVal[1] == 1) {
        return xVal[2];
    } else {
        return xVal[2 + (bGender ? 0 : 1)];
    }
}

function From0To999(fValue, oObjDesc, fnAddNum, fnAddDesc)
{
    var nCurrState = 2;
    if (Math.floor(fValue/100) > 0) {
        var fCurr = Math.floor(fValue/100)*100;
        fnAddNum(Value(fCurr, oObjDesc._Gender));
        nCurrState = mapNumbers[fCurr][0];
        fValue -= fCurr;
    }
    if (fValue < 20) {
        if (Math.floor(fValue) > 0) {
            fnAddNum(Value(fValue, oObjDesc._Gender));
            nCurrState = mapNumbers[fValue][0];
        }
    } else {
        var fCurr = Math.floor(fValue/10)*10;
        fnAddNum(Value(fCurr, oObjDesc._Gender));
        nCurrState = mapNumbers[fCurr][0];
        fValue -= fCurr;
       
        if (Math.floor(fValue) > 0) {
            fnAddNum(Value(fValue, oObjDesc._Gender));
            nCurrState = mapNumbers[fValue][0];
        }
    }
    fnAddDesc(oObjDesc._arrStates[nCurrState]);
}

function SumProp(fAmount)
{
    var fInt = Math.floor(fAmount + 0.005);
    var fDec = Math.floor(((fAmount - fInt) * 100) + 0.5);

    var arrRet = [];
    var iOrder = 0;
    var arrThousands = [];
    for (; fInt > 0.9999; fInt/=1000) {
        arrThousands.push(Math.floor(fInt % 1000));
    }
    if (arrThousands.length == 0) {
        arrThousands.push(0);
    }

    function PushToRes(strVal) {
        arrRet.push(strVal);
    }

    for (var iSouth = arrThousands.length-1; iSouth >= 0; --iSouth) {
        if (arrThousands[iSouth] == 0) {
            continue;
        }
        From0To999(arrThousands[iSouth], mapOrders[iSouth], PushToRes, PushToRes);
    }

    if (arrThousands[0] == 0) {
        //  Handle zero amount
        if (arrThousands.length == 1) {
            PushToRes(Value(0, mapOrders[0]._Gender));
        }

        var nCurrState = 2;
        PushToRes(mapOrders[0]._arrStates[nCurrState]);
    }

    if (arrRet.length > 0) {
        // Первая буква заглавная
        arrRet[0] = arrRet[0].match(/^(.)/)[1].toLocaleUpperCase() + arrRet[0].match(/^.(.*)$/)[1];
    }

    arrRet.push((fDec < 10) ? ("0" + fDec) : ("" + fDec));
    From0To999(fDec, objKop, function() {}, PushToRes);

    return arrRet.join(" ");
}
 

Вложения

Очевидно надо отлавливать запятую в самом начале.
js не владею и ваш код мне непонятен, но вам уже давали понятный и простой код. Вот в нём я могу поставить замену запятой. А вы уж дальше сами, по аналогии.
Вот, к примеру:
(акробата нет совсем и подходящих программ для создания pdf тоже под рукой нет, поэтому засунул код в html. В старом IE работать не будет, не понимает trim, в Firefox и Maxthon без проблем)
 

Вложения

  • Спасибо
Реакции: bsi
Очевидно надо отлавливать запятую в самом начале.
Вам уже давали понятный и простой код. Вот в нём я могу поставить замену запятой.

Попробовал эту функцию. Она у меня работает, но в динамическом варианте, если я ставлю отлавливание запятой (var x =this.rawValue.replace(",", ".");) в начале функции, динамического заполнения поля, где пропись, не происходит. С отлавливанием запятой функция работает только если я ее (функцию) прописываю непосредственно в событии exit. Если же функцию, с отлавливанием запятой, ставлю в этот кусок кода формы
Код:
 <variables>
         <script contentType="application/x-javascript" name="SummaPopisu">   function money2string(x)
</script>
         <?templateDesigner expand 1?>
</variables>
там у меня все другие функции, то функция и при событии exit, не работает.
Проблема еще в том, что первое слово прописи пишется со строчной буквы, а мне надо с заглавной. Я так понимаю, что вот этот кусок кода отвечает за первую букву первого слова прописи
// r=r.trimMiddle();
// r=r.substr(0,1).toUpperCase()+r.substr(1);
он в функции закомментирован, если коммент снимаю, то все равно первое слово с прописной буквы.
Короче у меня не получилось сделать динамический ввод, так как хотелось. Конечно это не смертельно, можно ставить просто точку, но удобней было бы работать с правой цифровой клавиатурой не переключая язык клавиатуры.
 
Про замену запятой я не понял. Вам нужно менять запятую в форме что ли? Зачем?
Насчёт заглавной буквы. Неохота вникать в этот мрак, но вроде trim не работает не только в IE, но и в акробате.
Можно написать так:
r=r.substr(1,1).toUpperCase()+r.substr(2);
без всяких тримов.
 
  • Спасибо
Реакции: bsi
Про замену запятой я не понял. Вам нужно менять запятую в форме что ли? Зачем?
Поле для ввода суммы с текстового хочу изменить на десятичное (есть такое в Live Cycle Form Designer), но проблема в том, что после потери фокуса полем где вводится числовое значение, даже если ставлю точку, точка меняется на запятую и при редактировании числового значения в этом поле, синхронного обновления в поле где пропись, не происходит, целая часть (рубли прописью) меняется, а дробная (копейки прописью) нет.
А на счет заглавной буквы все исправил. Trim в акробате похоже не работает.
Думаю что с заменой запятой в десятичном поле вряд ли что получится.
Спасибо за участие.
 
Думаю что с заменой запятой в десятичном поле вряд ли что получится.
Сейчас только что дошло. Единственный вариант это если замену запятой (для редактирования цифровых данных) производить во время активации поля и при выходе из поля. Надо будет попробовать.
 
Зачем вообще что-то менять в поле? Да пускай там хоть двоеточие: будет или точка с запятой;
Я думал смысл в том, чтоб любой разделитель обрабатывался корректно. А какой смысл менять что-то в поле? Поставьте в региональных настройках системы вместо запятой точку.
 
Я тоже предпочитаю запятую. Оно привычней смотрится. При этом, я не вижу проблемы с любым разделительным знаком. Реализовать такое несложно, на любом языке. Меня нервирует, когда импортные программы кочевряжатся ))
 
Я тоже предпочитаю запятую. Оно привычней смотрится.
Да я не против запятой. Может я объяснение как-то не понятно дал с самого начала. Откройте мою форму и посмотрите как меняется отображение суммы прописью. Если, не выходя из поля где цифры, разделителем поставить запятую и продолжить вводить копейки, то где пропись копейки меняться не будут, если поставить точку, они копейки меняются, вот в чем проблема. Если поле, где числовой ввод имеет тип текстовое, то если мы поставили точку и перешли на другое поле, точка так и осталась в поле где ввод цифр. Продуем редактировать цифровой ввод. С точкой все работает, а с запятой, изменения в поле где пропись, происходят только с рублями. Теперь рассмотрим вариант когда поле цифрового ввода имеет тип десятичное. Вводим цифры, пока вводим целую часть все нормально, ставим точку и вводим копейки, опять все нормально, переходим на другое поле, в поле, где цифровой ввод, точка автоматом поменялась на запятую и если пользователь решил что-то изменить в цифровом поле, то чтобы все правильно сработало, ему запятую вновь надо поменять на точку. Как сделать так, что бы все правильно работало с запятой?
Прилагаю два фала с текстовым полем и десятичным.
 

Вложения

Угу. Что-то прояснилось, хотя смутно. У меня нет Live Cycle Form, я не знаю как там задаются поля. Хотя логично, что если поле числовое, то оно имеет автоформат (ставит знак, который по-умолчанию в системных настройках), либо вообще не срабатывает. Ставьте тогда текстовое поле, чтоб ничего не менялось.
Попробовал сделать форму в скрибусе. Оказалось, что тип данных автоматически меняется, в зависимости точку вводишь или запятую (Reader XI). И простой отлов запятой не срабатывает. Но можно просто менять тип данных после получения и всё будет работать.
Не знаю, насколько это грамотно в js:
Код:
x = x.toString();
if (x.indexOf(",")!=-1) {
x=x.replace(",", ".");
}
x=parseFloat(x);
 

Вложения

  • Спасибо
Реакции: bsi
Угу. Что-то прояснилось, хотя смутно.
Не знаю, насколько это грамотно в js:
Код:
x = x.toString();
if (x.indexOf(",")!=-1) {
x=x.replace(",", ".");
}
x=parseFloat(x);
Ваша форма в Акробате работает нормально. Не знаю правильно ли у меня все получилось. Переделал Ваш файл в Live Cycle Form Designer, вроде работает в текстовом поле и с точкой и с запятой, но в поле проверка у меня почему-то не происходит смена типа поля, все время отображается objct. Может что-то не так? Файл прикрепил. И еще один момент. В вашей функции, если ставлю целую часть 0 (ноль), то пишет Оль рублей. Динамический вариант не пробовал, время пока нет. Благодарю за помощь.
 

Вложения

Оль рублей, это здорово... Вот что бывает, когда особо не вникая копипастишь чужой код.
Напишите тогда собственную функцию удаления пробелов (если код символа равен 32, то...). Не вижу ничего сложного.
 
  • Спасибо
Реакции: bsi
Добил я динамику. Работает и с точкой и запятой. Остался последний штрих. Наверное можно где-то в функции делать проверку, что бы убрать поле с проверкой, или его просто сделать невидимым? Еще раз спасибо за помощь. Приложил файл с динамикой.
 

Вложения

Поле не нужно, удалить и всё (если я правильно понял).
 
  • Спасибо
Реакции: bsi
Да, поле удаляем и из функции удаляем строку для проверки. Все работает, премного благодарен. Тему можно закрыть.
 
Статус
Закрыто для дальнейших ответов.