私はこの問題を解決しようとしていました:
このカタでは、文字列を整数に変換したいと考えています。文字列は単純に数字を単語で表します。
例:
- "1" => 1
- "20" => 20
- 「二百四十六」 => 246
- 「七百八十三千九百十九」 => 783919
================================================== ================================
これを行うために、以下のコードを思いつきました。 あなたの便宜のためにjsfiddleで。
私が遭遇した問題は、「70 万」が 10700 になることです。
私は一日かけて周りを見回してこれを理解しようとしましたが、ただ立ち往生しています。プログラムが実行する手順は次のとおりです。
- 文字列は「千百七」になります-良い
- 最初のwhileループは「千」を見つけ、乗数を1000に設定します-良いです
- 2 番目の while ループは「100」を検出しますが、mult.exec(a[0]) if ステートメントは null に解決されます。- くそ
したがって、乗数が 100000 になる代わりに、値が 100000 になり、間違った答えを得る運命にあります。
これをデバッグしようとしているときに、jsfiddle の while の 2 番目のループで使用される配列を作成しようとしました。そこでは機能し、null ではなく「100」と同等でした。なぜこれが起こるのか知っている人はいますか?
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;
}