Работая над на codewars я пытался решить эту проблему:Javascript разбора строки в целое
В этом ката мы хотим, чтобы преобразовать строку в целое число. Строки просто представляют числа в словах.
Примеры:
- "один" => 1
- "двадцать" => 20
- "двести сорок шесть" => 246
- «семьсот восемьдесят три тысячи девятьсот девятнадцать "=> 783919
====================================================================================================================================================================================== ==========================================
Я придумал код ниже, чтобы сделать это. On jsfiddle for you convience.
Проблема я столкнулся в «семьсот тысяч» дает 10700.
Я провел целый день, глядя вокруг и пытается понять это, но я просто плоский застрял. Шаги, программа занимает:
- строка становится «тысяча сто семь» - хороший
- первым в то время как петля находки «Thousand» и устанавливают множитель 1000 - хороший
- второго в то время как петля находки «сто», но то оператор mult.exec (a [0]) if имеет значение null. - damn
Таким образом, вместо множителя, становящегося 100000, значение становится 100000, и мы обречены на неправильный ответ.
При попытке отладки это я попытался создать массив, используемый во время второго цикла в то время как в jsfiddle. Там он работал и приравнивался к «сто» вместо нуля. Кто-нибудь знает, почему это произойдет?
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;
}
Это интересная проблема, над которой вы работаете, и я не могу сказать, что полностью понимаю ваш код. Однако есть несколько ошибок, которые напрямую не связаны с вашей проблемой. 1) вы можете избежать столкновения имен со встроенной функцией parseInt. Это может не повлиять на поведение ваших кодов, но, вероятно, это плохая практика использования такого встроенного имени. –
2) ваше регулярное выражение 'find' не защищает должным образом соответствующие соответствия - в вашем примере скрипт JS кажется, что он соответствует 7 символам в качестве правильного префикса, когда он должен соответствовать« семнадцать ». Вы хотите включить в строку регулярных выражений белые пробелы, чтобы принудительно выполнить полное слово. –
Утонченная идея, я собираюсь включить это в свой французский лексический анализатор, чтобы предложить представление числа (int) вместо представления слова (строки), когда числа растут слишком большими. Согласовано с @MikeEdwards, хотя есть некоторые случаи, о которых вы, возможно, захотите знать: '7' будет результатом' семь' и 'семнадцать', потому что RegEx перестает сопоставлять, когда находит первую действительную часть (' seven'). '4' в' four' и 'fourteen' - еще один пример.Вам нужно обходное решение, как тот, который он предложил. Кроме того, разве не интересно, что каждое число на английском языке можно разбить на 30 или около того? –