Как преобразовать числа в слова (написание чисел) в Javascript

Целью программирования является многоцелевая оптимизация, мы пишем код для автоматизации вещей, для выполнения которых вручную потребуется некоторое время. Для многих проектов вам нужно будет преобразовать число в его представление слов, чтобы пользователь не записал все число в слова (например номер 123456789 со словами будет сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять). Да, это действительно длинный номер, и я знаю, что вы даже не прочитали весь номер, так почему бы вашему пользователю захотеть написать его самому? Сделайте эту задачу легкой для ваших пользователей, автоматизировав ее.

В этой статье вы научитесь преобразовывать числа в их представление слов либо с помощью библиотеки, либо с помощью одной функции.

А. Используйте библиотеку

Чтобы преобразовать числа в слова с помощью Javascript, мы будем использовать пакет numberToWords. Этот модуль содержит некоторые используемые методы для преобразования чисел в слова, порядковые слова и порядковые номера.

Вы можете установить этот модуль при выполнении npm (так как этот модуль зарегистрирован на npm, он отлично работает и с Node.js):

npm install number-to-words

Или если вы используете беседку:

bower install number-to-words

Если вы не используете менеджер пакетов для Javascript, вы можете просто скачать минимизированный файл репозитория здесь. Затем в браузере numberToWords переменная будет глобально доступна в документе, а затем включить numberToWords.min.js файл в вашем документе, используя тег script:

Если вы хотите больше информации об этом проекте, посетите официальный репозиторий в Github здесь.

Заметка

Эта библиотека преобразует только целые числа, любое значение с плавающей точкой будет автоматически проанализировано в целое число.

использование

Библиотека предоставляет 3 метода, которые позволяют преобразовать целое число (или число в строковом типе) в слова. Помните, что вам требуется модуль в случае, если вы используете requireJS:

// If you're using Node.js or browserify (requireJS)
// require the module using:
var numberToWords = require('number-to-words');
numberToWords.toWords(13); // => “thirteen”
// If you're using the script in the browser
// then the global "numberToWords" variable will be accesible in the window
numberToWords.toOrdinal(1);
numberToWords.toWordsOrdinal(1);
numberToWords.toWords(1);

1. Преобразование числа в его сокращенный порядковый номер

С помощью этой библиотеки вы можете легко преобразовать числа в порядковые номера, порядковый номер определяет положение чего-либо в серии, например, первое, второе или третье. Порядковые числа используются как прилагательные, существительные и местоимения.

Чтобы преобразовать число в сокращенный порядковый номер, используйте .toOrdinal метод:

// 1st
numberToWords.toOrdinal(1);
// 2nd
numberToWords.toOrdinal(2);
// 3rd
numberToWords.toOrdinal(3);
// 1500th
numberToWords.toOrdinal(1500);
// 1234567890th
numberToWords.toOrdinal(1234567890);

Метод возвращает строку с сокращенным порядковым значением предоставленного целого числа (или строки) в качестве первого параметра.

2. Преобразование числа в его порядковый номер в словах

Вместо того, чтобы использовать сокращение, numberToWords позволяет преобразовать число в порядковый номер в словах, используя .toWordsOrdinal метод:

// first
numberToWords.toWordsOrdinal(1);
// second
numberToWords.toWordsOrdinal(2);
// third
numberToWords.toWordsOrdinal(3);
// one thousand, five hundredth
numberToWords.toWordsOrdinal(1500);
// one billion, two hundred thirty-four million, five hundred sixty-seven thousand, eight hundred ninetieth
numberToWords.toWordsOrdinal(1234567890);

Довольно круто и легко, не так ли?

3. Преобразование числа в слова

Вы можете легко преобразовать число в представление его слов, используя .toWords метод:

// one
numberToWords.toWords(1);
// two
numberToWords.toWords(2);
// three
numberToWords.toWords(3);
// one thousand, five hundred
numberToWords.toWords(1500);
// one billion, two hundred thirty-four million, five hundred sixty-seven thousand, eight hundred ninety
numberToWords.toWords(1234567890);

Важная заметка

Эта библиотека поддерживает преобразование до 999999999999999 (15-значный номер).

Использование библиотеки с большим номером неизбежно приведет к исключению Uncaught RangeError: превышен максимальный размер стека вызовов что вы можете легко предотвратить использование оператора try / catch.

Б. Самореализация

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

/**
* Convert an integer to its words representation
*
* @author McShaman (http://stackoverflow.com/users/788657/mcshaman)
* @source http://stackoverflow.com/questions/14766951/convert-digits-into-words-with-javascript
*/
function numberToEnglish(n, custom_join_character) {
var string = n.toString(),
units, tens, scales, start, end, chunks, chunksLen, chunk, ints, i, word, words;
var and = custom_join_character || 'and';
/* Is number zero? */
if (parseInt(string) === 0) {
return 'zero';
}
/* Array of units as words */
units = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
/* Array of tens as words */
tens = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
/* Array of scales as words */
scales = ['', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion', 'octillion', 'nonillion', 'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quatttuor-decillion', 'quindecillion', 'sexdecillion', 'septen-decillion', 'octodecillion', 'novemdecillion', 'vigintillion', 'centillion'];
/* Split user arguemnt into 3 digit chunks from right to left */
start = string.length;
chunks = [];
while (start > 0) {
end = start;
chunks.push(string.slice((start = Math.max(0, start - 3)), end));
}
/* Check if function has enough scale words to be able to stringify the user argument */
chunksLen = chunks.length;
if (chunksLen > scales.length) {
return '';
}
/* Stringify each integer in each chunk */
words = [];
for (i = 0; i < chunksLen; i++) {
chunk = parseInt(chunks[i]);
if (chunk) {
/* Split chunk into array of individual integers */
ints = chunks[i].split('').reverse().map(parseFloat);
/* If tens integer is 1, i.e. 10, then add 10 to units integer */
if (ints[1] === 1) {
ints[0] += 10;
}
/* Add scale word if chunk is not zero and array item exists */
if ((word = scales[i])) {
words.push(word);
}
/* Add unit word if array item exists */
if ((word = units[ints[0]])) {
words.push(word);
}
/* Add tens word if array item exists */
if ((word = tens[ints[1]])) {
words.push(word);
}
/* Add 'and' string after units or tens integer if: */
if (ints[0] || ints[1]) {
/* Chunk has a hundreds integer or chunk is the first of multiple chunks */
if (ints[2] || !i && chunksLen) {
words.push(and);
}
}
/* Add hundreds word if array item exists */
if ((word = units[ints[2]])) {
words.push(word + ' hundred');
}
}
}
return words.reverse().join(' ');
}

И вы можете легко использовать:

// one hundred and twenty three million four hundred and fifty six thousand seven hundred and eighty nine
numberToEnglish(123456789);
// Use a custom separator (like , instead of "and")
// one hundred , twenty three million four hundred , fifty six thousand seven hundred , eighty nine
numberToEnglish(123456789, ",");

Так же, как и в библиотеке, разрешена только цифра до 15 цифр. Тем не менее, в этом случае эта функция не будет выдавать исключение, но значения, которые будут генерироваться в словах, будут неправильными. Кроме того, эта реализация не поддерживает преобразование в порядковый номер.

Ссылка на основную публикацию
Adblock
detector