在Codewars上,我正在尝试解决这个问题:将字符串转换为整数。 这些字符串只是用单词表示的数字。例如:“one” => 1,“twenty” => 20,“two hundred forty-six” => 246,“seven hundred eighty-three thousand nine hundred and nineteen” => 783919。
我想出了下面的代码来实现这一点。点击这里在JSFiddle上查看。我遇到的问题是“七十万”会得到10700这个结果。
我花了一天时间寻找答案,但还是束手无策。程序的步骤如下:
- 将字符串变成'thousand hundred seven',很好。 - 第一个while循环找到“thousand”,并将乘数设置为1000,很好。 - 第二个while循环找到“hundred”,但mult.exec(a[0])语句解析为null,真是糟糕。
因此,乘数不是变成了100000而是值变成了100000,我们注定会得到错误的答案。
在尝试调试时,我尝试在JSFiddle中创建第二个循环中使用的数组a。那里它有效地等于'hundred'而不是null。有人知道为什么会发生这种情况吗?
我想出了下面的代码来实现这一点。点击这里在JSFiddle上查看。我遇到的问题是“七十万”会得到10700这个结果。
我花了一天时间寻找答案,但还是束手无策。程序的步骤如下:
- 将字符串变成'thousand hundred seven',很好。 - 第一个while循环找到“thousand”,并将乘数设置为1000,很好。 - 第二个while循环找到“hundred”,但mult.exec(a[0])语句解析为null,真是糟糕。
因此,乘数不是变成了100000而是值变成了100000,我们注定会得到错误的答案。
在尝试调试时,我尝试在JSFiddle中创建第二个循环中使用的数组a。那里它有效地等于'hundred'而不是null。有人知道为什么会发生这种情况吗?
function parseInt(number) {
// reference array for english -> integer
var ref = { one:1, two:2, three:3, four:4, five:5, six:6, seven:7, eight:8, nine:9, ten:10, eleven:11, twelve:12, thirteen:13, fourteen:14, fifteen:15, sixteen:16, seventeen:17, eighteen:18, nineteen:19, twenty:20, thirty: 30, forty: 40, fifty: 50, sixty: 60, seventy: 70, eighty: 80, ninety:90, hundred: 100, thousand: 1000, million: 1000000 };
// regex to find number values from the string
var find = new RegExp( "(one|t(wo|hree|en|welve|hirteen|wenty|hirty)|f(our|ive|ourteen|iftenn|orty|ifty)|s(ixteen|ixty|eventy|ix|even|eventeen|teen)|eigh(ty|t|teen)|nin(ety|e|eteen)|zero|hundred|thousand|million)", "gi" );
// hundred/thousand/million etc. act as multipliers in this solution and need a seperate search
var mult = new RegExp( "(hundred|thousand|million)", "gi" );
// reversing the string allows us to add largest digits first
number = number.split(' ').reverse().join(" ");
// while there is a number in string number
// if that number is a multiplier
// if that number is 100 -> multiplier = multiplier * 100;
// else multiplier = reference value;
// else value = value + reference value * multiplier
// end while
value = 0; multiplier = 1;
while( a = find.exec(number) ) {
if( m = mult.exec(a[0]) ) {
if( m[0] == 'hundred' ) { multiplier *= 100; }
else { multiplier = ref[m[0]]; }
}
else {
value += ref[a[0]] * multiplier;
}
}
return value;
}
7
将是seven
和seventeen
的结果,因为正则表达式在找到第一个有效部分(seven
)时停止匹配。four
和fourteen
中的4
也是另一个例子。您需要像他建议的那样的解决方法。此外,有趣的是,英语中的每个数字都可以分解成30多个部分。 - Chris Cirefice