2016-04-20 42 views
0

我有一个项目要求我将数字转换为单词,但关键是要将数字转换为23,而不是二十三。我发现this script这很好,除了它不会连字。什么是最好的方式来完成我想要做的事情?在Javascript中将数字转换为带有连字的单词

编辑

它需要转换数字,如:142至一百四十二个,不是一百四十两个或一个一百四十二个

回答

0

有一群很好的答案,但没有人去了超过4或5位......这是我落得这样做,让我完成项目。

var th = ['', 'thousand', 'million', 'billion', 'trillion']; 
 
var dg = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']; 
 
var tn = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']; 
 
var tw = ['twenty-', 'thirty-', 'forty-', 'fifty-', 'sixty-', 'seventy-', 'eighty-', 'ninety-']; 
 

 
function toWords(s) { 
 
    s = s.toString(); 
 
    s = s.replace(/[\, ]/g, ''); 
 
    if (s != parseFloat(s)) return 'not a number'; 
 
    var x = s.indexOf('.'); 
 
    if (x == -1) x = s.length; 
 
    if (x > 15) return 'too big'; 
 
    var n = s.split(''); 
 
    var str = ''; 
 
    var sk = 0; 
 
    for (var i = 0; i < x; i++) { 
 
     if ((x - i) % 3 == 2) { 
 
      if (n[i] == '1') { 
 
       str += tn[Number(n[i + 1])] + ' '; 
 
       i++; 
 
       sk = 1; 
 
      } else if (n[i] != 0) { 
 
       str += tw[n[i] - 2] + ' '; 
 
       sk = 1; 
 
      } 
 
     } else if (n[i] != 0) { 
 
      str += dg[n[i]] + ' '; 
 
      if ((x - i) % 3 == 0) str += 'hundred '; 
 
      sk = 1; 
 
     } 
 
     if ((x - i) % 3 == 1) { 
 
      if (sk) str += th[(x - i - 1)/3] + ' '; 
 
      sk = 0; 
 
     } 
 
    } 
 
    if (x != s.length) { 
 
     var y = s.length; 
 
     str += 'point '; 
 
     for (var i = x + 1; i < y; i++) str += dg[n[i]] + ' '; 
 
    } 
 
    final = str.replace(/\s+/g, ' ').replace(/- /g, '-'); 
 
    if (final.substring(final.length-1) == "-"){ 
 
     final = final.substring(0, final.length-1); 
 
    } 
 
    return final; 
 
} 
 

 
var i; 
 
for (i = 15; i < 25; i++) { 
 
    document.write(toWords(i) + '<br>'); 
 
} 
 

 
document.write(toWords(2745635) + '<br>');

1

您可以使用代码,您发现,通过空间分割结果和连字符连接回:

toWords(23).split(' ').join('-'); 
+0

这或编辑脚本你发现任何你看到他们做的东西有',替换为“ - ” –

+0

@ CalebO'Leary权,这就是更好的解决方案 – madox2

+1

会不会用连字符替换每个空间? –

0

你可以尝试使用lastIndexOfsubstr功能

var num = toWords(23); 
var index = num.lastIndexOf(' '); 

if(index != -1) { 
    num = num.substr(0, index) + "-" + num.substr(index); 
} 
+0

你可以看看编辑吗? –

+0

@CircleB请参阅更新 – isvforall

1

这将为短号码(低于20000)做的事:

number_string.replace(/ty (\S)/g,'ty-$1'); 

如果你可能有相同的数字“四万零五”,不过,你必须要更加具体:

number_string.replace(/ty (one|two|three|four|five|six|seven|eight|nine)/gi,'ty-$1'); 
1

这是针对虚线数字的自定义提案。

function wordify(n) { 
 
    var word = [], 
 
     numbers = { 
 
      1: 'One', 
 
      2: 'Two', 
 
      3: 'Three', 
 
      4: 'Four', 
 
      5: 'Five', 
 
      6: 'Six', 
 
      7: 'Seven', 
 
      8: 'Eight', 
 
      9: 'Nine', 
 
      10: 'Ten', 
 
      11: 'Eleven', 
 
      12: 'Twelve', 
 
      t3: 'Thir', // -teen, -ty 
 
      t5: 'Fif', 
 
      t8: 'Eigh', 
 
      20: 'Twenty' 
 
     }, 
 
     hundreds = 0 | (n % 1000)/100, 
 
     tens = 0 | (n % 100)/10, 
 
     ones = n % 10, 
 
     part; 
 

 
    if (n === 0) { 
 
     return 'Zero'; 
 
    } 
 
    if (hundreds) { 
 
     word.push(numbers[hundreds] + ' Hundred'); 
 
    } 
 
    if (tens === 0) { 
 
     word.push(numbers[ones]); 
 
    } else if (tens === 1) { 
 
     word.push(numbers['1' + ones] || (numbers['t' + ones] || numbers[ones]) + 'teen'); 
 
    } else { 
 
     part = numbers[tens + '0'] || (numbers['t' + tens] || numbers[tens]) + 'ty'; 
 
     word.push(numbers[ones] ? part + '-' + numbers[ones] : part); 
 
    } 
 
    return word.join(' '); 
 
} 
 

 
var i; 
 
for (i = 0; i < 2000; i++) { 
 
    document.write(wordify(i) + '<br>'); 
 
}