我有一个项目要求我将数字转换为单词,但关键是要将数字转换为23,而不是二十三。我发现this script这很好,除了它不会连字。什么是最好的方式来完成我想要做的事情?在Javascript中将数字转换为带有连字的单词
编辑
它需要转换数字,如:142至一百四十二个,不是一百四十两个或一个一百四十二个
我有一个项目要求我将数字转换为单词,但关键是要将数字转换为23,而不是二十三。我发现this script这很好,除了它不会连字。什么是最好的方式来完成我想要做的事情?在Javascript中将数字转换为带有连字的单词
编辑
它需要转换数字,如:142至一百四十二个,不是一百四十两个或一个一百四十二个
有一群很好的答案,但没有人去了超过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>');
您可以使用代码,您发现,通过空间分割结果和连字符连接回:
toWords(23).split(' ').join('-');
你可以尝试使用lastIndexOf
和substr
功能
var num = toWords(23);
var index = num.lastIndexOf(' ');
if(index != -1) {
num = num.substr(0, index) + "-" + num.substr(index);
}
你可以看看编辑吗? –
@CircleB请参阅更新 – isvforall
这将为短号码(低于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');
这是针对虚线数字的自定义提案。
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>');
}
这或编辑脚本你发现任何你看到他们做的东西有',替换为“ - ” –
@ CalebO'Leary权,这就是更好的解决方案 – madox2
会不会用连字符替换每个空间? –