Использование parseFloat () в разных локалях - PullRequest
0 голосов
/ 10 января 2020

У меня есть поле ввода, отформатированное с использованием .toLocaleString().

Затем мне нужно использовать parseFloat() для этого значения, чтобы преобразовать его в число.

Чтобы сделать это с в США, я просто использую value.replace(',',''), чтобы убрать десятичные дроби перед выполнением parseFloat().

Однако это не работает в европейских локалях, в которых тысячи разделителей и десятичных точек инвертированы.

Существует ли метод определения локали, в которой находится ваш пользователь, а затем следует ли сначала инвертировать запятые и десятичные числа?

1 Ответ

1 голос
/ 10 января 2020

Вы можете использовать toLocaleString, чтобы сначала увидеть, как число примера преобразуется в строку, затем узнать из этого вывода, что такое разделители локали, и использовать эту информацию для анализа строки:

function localeParseFloat(s, locale) {
    // Get the thousands and decimal separator characters used in the locale.
    let [,thousandsSeparator,,,,decimalSeparator] = 1111.1.toLocaleString(locale);
    // Remove thousand separators, and put a point where the decimal separator occurs
    s = Array.from(s, c => c === thousandsSeparator ? "" 
                         : c === decimalSeparator   ? "." : c).join("");
    // Now it can be parsed
    return parseFloat(s);
}

console.log(parseFloat(localeParseFloat("1.100,9"))); // user's locale
console.log(parseFloat(localeParseFloat("1.100,9", "us"))); // US locale
console.log(parseFloat(localeParseFloat("1.100,9", "nl"))); // Dutch locale: reversed meaning of separators
// And the same but with separators switched:
console.log(parseFloat(localeParseFloat("1,100.9"))); // user's locale
console.log(parseFloat(localeParseFloat("1,100.9", "us"))); // US locale
console.log(parseFloat(localeParseFloat("1,100.9", "nl"))); // Dutch locale: reversed meaning of separators
...