Задача: Преобразование сумм из цифрового представления в строковое
Исходник: Сумма прописью, альтернативная реализация, язык: javascript [code #560, hits: 11515]
автор: - [добавлен: 24.07.2008]
  1. var mapNumbers = {
  2. 0 : [2, 1, "ноль"],
  3. 1 : [0, 2, "один", "одна"],
  4. 2 : [1, 2, "два", "две"],
  5. 3 : [1, 1, "три"],
  6. 4 : [1, 1, "четыре"],
  7. 5 : [2, 1, "пять"],
  8. 6 : [2, 1, "шесть"],
  9. 7 : [2, 1, "семь"],
  10. 8 : [2, 1, "восемь"],
  11. 9 : [2, 1, "девять"],
  12. 10 : [2, 1, "десять"],
  13. 11 : [2, 1, "одиннадцать"],
  14. 12 : [2, 1, "дванадцать"],
  15. 13 : [2, 1, "тринадцать"],
  16. 14 : [2, 1, "четырнадцать"],
  17. 15 : [2, 1, "пятнадцать"],
  18. 16 : [2, 1, "шестнадцать"],
  19. 17 : [2, 1, "семнадцать"],
  20. 18 : [2, 1, "восемнадцать"],
  21. 19 : [2, 1, "девятнадцать"],
  22. 20 : [2, 1, "дватцать"],
  23. 30 : [2, 1, "тридцать"],
  24. 40 : [2, 1, "сорок"],
  25. 50 : [2, 1, "пятьдесят"],
  26. 60 : [2, 1, "шестьдесят"],
  27. 70 : [2, 1, "семьдесят"],
  28. 80 : [2, 1, "восемьдесят"],
  29. 90 : [2, 1, "девяносто"],
  30. 100 : [2, 1, "сто"],
  31. 200 : [2, 1, "двести"],
  32. 300 : [2, 1, "триста"],
  33. 400 : [2, 1, "четыреста"],
  34. 500 : [2, 1, "пятьсот"],
  35. 600 : [2, 1, "шестьсот"],
  36. 700 : [2, 1, "семьсот"],
  37. 800 : [2, 1, "восемьсот"],
  38. 900 : [2, 1, "девятьсот"]
  39. };
  40.  
  41. var mapOrders = [
  42. { _Gender : false, _arrStates : ["рубль", "рубля", "рублей"], _bAddZeroWord : true },
  43. { _Gender : false, _arrStates : ["тысяча", "тисячи", "тысяч"] },
  44. { _Gender : true, _arrStates : ["миллион", "миллиона", "миллионов"] },
  45. { _Gender : true, _arrStates : ["миллиард", "миллиарда", "миллиардов"] },
  46. { _Gender : true, _arrStates : ["триллион", "триллиона", "триллионов"] }
  47. ];
  48.  
  49. var objKop = { _Gender : false, _arrStates : ["копейка", "копейки", "копеек"] };
  50.  
  51. function Value(dVal, bGender) {
  52. var xVal = mapNumbers[dVal];
  53. if (xVal[1] == 1) {
  54. return xVal[2];
  55. } else {
  56. return xVal[2 + (bGender ? 0 : 1)];
  57. }
  58. }
  59.  
  60. function From0To999(fValue, oObjDesc, fnAddNum, fnAddDesc)
  61. {
  62. var nCurrState = 2;
  63. if (Math.floor(fValue/100) > 0) {
  64. var fCurr = Math.floor(fValue/100)*100;
  65. fnAddNum(Value(fCurr, oObjDesc._Gender));
  66. nCurrState = mapNumbers[fCurr][0];
  67. fValue -= fCurr;
  68. }
  69.  
  70. if (fValue < 20) {
  71. if (Math.floor(fValue) > 0 || (oObjDesc._bAddZeroWord)) {
  72. fnAddNum(Value(fValue, oObjDesc._Gender));
  73. nCurrState = mapNumbers[fValue][0];
  74. }
  75. } else {
  76. var fCurr = Math.floor(fValue/10)*10;
  77. fnAddNum(Value(fCurr, oObjDesc._Gender));
  78. nCurrState = mapNumbers[fCurr][0];
  79. fValue -= fCurr;
  80.  
  81. if (Math.floor(fValue) > 0) {
  82. fnAddNum(Value(fValue, oObjDesc._Gender));
  83. nCurrState = mapNumbers[fValue][0];
  84. }
  85. }
  86.  
  87. fnAddDesc(oObjDesc._arrStates[nCurrState]);
  88. }
  89.  
  90. function FloatToSamplesInWordsUkr(fAmount)
  91. {
  92. var fInt = Math.floor(fAmount + 0.005);
  93. var fDec = Math.floor(((fAmount - fInt) * 100) + 0.5);
  94.  
  95. var arrRet = [];
  96. var iOrder = 0;
  97. var arrSouthands = [];
  98. for (; fInt > 0.9999; fInt/=1000) {
  99. arrSouthands.push(Math.floor(fInt % 1000));
  100. }
  101. if (arrSouthands.length == 0) {
  102. arrSouthands.push(0);
  103. }
  104.  
  105. function PushToRes(strVal) {
  106. arrRet.push(strVal);
  107. }
  108. for (var iSouth = arrSouthands.length-1; iSouth >= 0; --iSouth) {
  109. From0To999(arrSouthands[iSouth], mapOrders[iSouth], PushToRes, PushToRes);
  110. }
  111.  
  112. if (arrRet.length > 0) {
  113. // Capitalize first letter
  114. arrRet[0] = arrRet[0].match(/^(.)/)[1].toLocaleUpperCase() + arrRet[0].match(/^.(.*)$/)[1];
  115. }
  116.  
  117. arrRet.push((fDec < 10) ? ("0" + fDec) : ("" + fDec));
  118. From0To999(fDec, objKop, function() {}, PushToRes);
  119.  
  120. return arrRet.join(" ");
  121. }
Вот, на днях срочно понадобился сабж на JS, но поиски в интернете ни к чему хорошему не привели. Написал в итоге свой вариант, может кому пригодится. Вроде бы проблем с портированием его на русский и английский (в других языках не силён) быть не должно.

Тестировалось под Active Scripting 5.6 (IE 5.5 и выше), в принципе под более ранними IE должно работать если заимплементить самому функцию Array.push.
Под мозиллу не тестировал, но на первый взгляд проблем быть не должно.

Источник: http://rsdn.ru/forum/Message.aspx?mid=2899783&only=1

+добавить реализацию