【问题标题】:Convert cents value in this INTO WORDS conversion Javascript在此 INTO WORDS 转换 Javascript 中转换美分值
【发布时间】:2014-01-13 17:30:53
【问题描述】:

我有一个将数值转换为单词的代码。如果用户输入的金额为美分,我只想在单词中添加美分。

例如。如果我有 1,000.88 的金额。文字中的价值将是仅一千比索和八十八美分

更新: 编辑代码以拆分整个值和美分值。唯一剩下的就是将美分转化为文字。

FIDDLE

var NUMBER2TEXT = {
        ones: ['', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'TEN', 'ELEVEN', 'TWELVE', 'THIRTEEN', 'FOURTEEN', 'FIFTEEN', 'SIXTEEN', 'SEVENTEEN', 'EIGHTEEN', 'NINETEEN'],
        tens: ['', '', 'TWENTY', 'THIRTY', 'FOURTY', 'FIFTY', 'SIXTY', 'SEVENTY', 'EIGHTY', 'NINETY'],
        sep: ['', ' THOUSAND ', ' MILLION ', ' BILLION ', ' TRILLION ', ' QUADRILLION ', ' QUINTILLION ', ' SEXTILLION ']
        };

        (function( ones, tens, sep ) {

        var input = document.getElementById( 'totalamountpaid' ),
        output = document.getElementById('words');

        input.onkeyup = function() {
        var val = this.value,
        arr = [],
        str = '',
        i = 0;

        if ( val.length === 0 ) {
        output.textContent = 'No amount paid';
        return;  
        }

        val = val.replace(/,/g,'');
        if ( isNaN( val ) ) {
        output.textContent = 'Invalid input.';
        return;   
        }


       val = val.toString();
       var valArray = val.split('\.', 2); //splits val into two seperate integers, whole numbers and decimals, in an array.   
       val = valArray[0]; //this is the whole number
       var val2 = valArray[1]; //this should be the decimals

        if(val2 != null && val2 != ''){
        //convert the decimals here
        var str2 = 'AND TWENTY CENTS';
        }else{
        var str2 = '';
        }

        while ( val ) {
        arr.push( val % 1000 );
        val = parseInt( val / 1000, 10 );   
        }

        while ( arr.length ) {
        str = (function( a ) {
        var x = Math.floor( a / 100 ),
        y = Math.floor( a / 10 ) % 10,
        z = a % 10;

        return ( x > 0 ? ones[x] + ' HUNDRED ' : '' ) +                 
        ( y >= 2 ? tens[y] + ' ' + ones[z] : ones[10*y + z] ); 
        })( arr.shift() ) + sep[i++] + str;                     
        }



        output.textContent = str + ' ' + str2 + ' PESOS ONLY';       
        };

        })( NUMBER2TEXT.ones, NUMBER2TEXT.tens, NUMBER2TEXT.sep );

【问题讨论】:

  • 我不明白你的问题是什么,你的想法似乎有一个好的开始。这不会很简单,因为语言不像数字那样合乎逻辑。
  • 不知道整数后面要加什么条件,怎么组合。
  • 对我来说,最简单的方法是 mystr.split("."); 并将它们作为两个单独的变量处理。 .split 函数会将它们放入数组中,你了解数组吗?
  • 是的,但如果你不介意编辑小提琴让我看看它是如何工作的?
  • 我不完全确定你的程序是如何工作的,但我可以试试。

标签: javascript jquery


【解决方案1】:

抱歉,由于某种原因,这行代码正在攻击我的代码。

val = parseInt( val.replace(/,/g,''), 10 );

我改成:

val = val.replace(/,/g,'');

它似乎具有相同的功能,同时允许我做我的事情。这是代码。我使用正则表达式在val(if 语句)中测试一段时间,然后将 val 拆分为一段时间前后的内容。 split 函数中的2 应该只允许从其中输出 2 个字符串,这意味着 10.20 将变为“10”和“20”,其中 1.2.3 将变为“1”和“2”,并丢弃 3。数组从 0 开始,所以 valArray[0] 是数组中的第一个字符串,valArray[1] 是第二个。

val = val.toString();
var valArray = val.split('\.', 2); //splits val into two seperate integers, whole numbers and decimals, in an array.   
val = valArray[0]; //this is the whole number
var val2 = valArray[1]; //this should be the decimals

if(val2 != null && val2 != ''){
//convert the decimals here
var str2 = 'TWENTY CENTS';
}
else{
var str2 = '';
}

更新:FIDDLE

【讨论】:

  • 我可以在小提琴中查看结果吗?
  • 抱歉,没有包含链接!检查更新!
  • 您可以.split() 而不检查字符。如果没有句点,您将收到一个长度为 1 的数组。您可能应该创建一个函数来处理数字到单词的转换,然后将数组的两个部分分别传递给该函数以获得最终答案(例如, var amount = numberToWords(part[0]) + ' dollars and ' + numberToWords(part[1]) + ' cents')
  • 转成文字就看你了,期间我只是展示了如何拆分。 20 美分只是一个例子。
  • 答案根据 user113215 略有更新,但您也应该将他的笔记记录在您的整体设计上。
【解决方案2】:

这是一个使用美元和美分的完整版本

const num2text = {
  ones: ['', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'TEN', 'ELEVEN', 'TWELVE', 'THIRTEEN', 'FOURTEEN', 'FIFTEEN', 'SIXTEEN', 'SEVENTEEN', 'EIGHTEEN', 'NINETEEN'],
  tens: ['', '', 'TWENTY', 'THIRTY', 'FOURTH', 'FIFTY', 'SIXTY', 'SEVENTY', 'EIGHTY', 'NINETY'],
  sep: ['', ' THOUSAND ', ' MILLION ', ' BILLION ', ' TRILLION ', ' QUADRILLION ', ' QUINTILLION ', ' SEXTILLION ']
};
const convert = function(val) {
  if (val.length === 0) {
    return '';
  }

  val = val.replace(/,/g, '');
  if (isNaN(val)) {
    return 'Invalid input.';
  }


  let [val1, val2] = val.split(".")
  let str2 = "";
  if (val2 != null && val2 != '') {
    //convert the decimals here
    var digits = (val2+"0").slice(0,2).split("");
    str2 = num2text.tens[+digits[0]] + " " + num2text.ones[+digits[1]]
  }
  let arr = [];
  while (val1) {
    arr.push(val1 % 1000);
    val1 = parseInt(val1 / 1000, 10);
  }
  let i = 0;
  let str = "";
  while (arr.length) {
    str = (function(a) {
      var x = Math.floor(a / 100),
        y = Math.floor(a / 10) % 10,
        z = a % 10;

      return (x > 0 ? num2text.ones[x] + ' HUNDRED ' : '') +
        (y >= 2 ? num2text.tens[y] + ' ' + num2text.ones[z] : num2text.ones[10 * y + z]);
    })(arr.shift()) + num2text.sep[i++] + str;
  }

  return str +
    ' DOLLARS ' +
    (str2 ? ' AND ' + str2 + ' CENTS' : '') +
    ' ONLY';
};


window.addEventListener("load", function() {
  document.getElementById("totalamountpaid").addEventListener("input", function() {
    document.getElementById("words").innerHTML = convert(this.value)
  });
});
<input id="totalamountpaid" placeholder="input amount" />
<br><br>
<label id="words"><label>

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多