chinese-numbers-converter
Advanced tools
Comparing version 1.0.2 to 2.0.0
@@ -37,3 +37,2 @@ /** | ||
'肆': 4, | ||
@@ -87,2 +86,10 @@ '四': 4, | ||
/** For converting strings like 8千3萬 into 8千3百萬. */ | ||
ChineseNumber.reverseMultipliers = { | ||
'10': '十', | ||
'100': '百', | ||
'1000': '千', | ||
'10000': '萬', | ||
}; | ||
/** | ||
@@ -98,4 +105,11 @@ * Returns the result of the conversion of Chinese number into an `Integer`. | ||
if (str === null || str === undefined || str === '') { | ||
throw 'Empty strings cannot be converted.'; | ||
} | ||
str = str.replace(/[,\s]/g, ''); // remove commas, spaces | ||
// Convert something like 8千3萬 into 8千3百萬 (8300*10000) | ||
str = this.addMissingUnits(str); | ||
// If the number begins with arabic numerals, parse and remove them first. | ||
@@ -110,3 +124,3 @@ // Example: 83萬. This number will be multiplied by the remaining part at | ||
} | ||
// Now parse the actual Chinese, character by character: | ||
@@ -150,3 +164,3 @@ var len = str.length; | ||
var numbersSoFar = 0; | ||
pairs.forEach(function (pair) { | ||
@@ -228,3 +242,3 @@ numbersSoFar += pair[0] * pair[1]; | ||
} | ||
} | ||
}; | ||
@@ -327,3 +341,3 @@ /** | ||
// Add a space, otherwise 1000萬800呎 will become 10000000800呎 | ||
translated += ' '; | ||
translated += ' '; | ||
} else { | ||
@@ -355,3 +369,5 @@ // If `minimumCharactersInNumber` is set, do not translate short | ||
previousCharacterIsNumber = false; | ||
// Cannot be false, otherwise `if (previousCharacterIsNumber) {` | ||
// below will fail for numbers that end with space: | ||
previousCharacterIsNumber = true; | ||
previousCharacterIsChineseNumber = false; | ||
@@ -370,3 +386,3 @@ } else { | ||
clearChineseNumber = chineseNumber.replace(/[,\s]/g, ''); | ||
if (clearChineseNumber === '' && chineseNumber.length === 1) { | ||
if (clearChineseNumber === '' && chineseNumber.length === 1) { | ||
// If the 'number' we assembled is actually something like comma, | ||
@@ -388,2 +404,3 @@ // space, or multiple commas and spaces, and occurs at the beginning: | ||
// Still add the current (non-number character) to the translated string: | ||
translated += character; | ||
@@ -407,2 +424,53 @@ | ||
/** | ||
* Converts a string like 8千3萬 into 8千3百萬 (8300*10000). | ||
* @param {string} str - The original string. | ||
* @returns {string} The converted, expanded string. | ||
*/ | ||
ChineseNumber.prototype.addMissingUnits = function (str) { | ||
var characters = str.split(''); | ||
var result = ''; | ||
var numbers = ChineseNumber.numbers; | ||
var reverse = ChineseNumber.reverseMultipliers; | ||
characters.forEach(function (character, i) { | ||
if (i === 0) { | ||
// For the first character, we don't have a previous character yet, so | ||
// just skip it: | ||
result += character; | ||
} else { | ||
var arabic = isNaN(character) ? numbers[character] : parseInt(character); // if it's already arabic, just use the arabic number | ||
var previousNumber = numbers[characters[i - 1]] || characters[i - 1]; | ||
var previousCharacterAsMultiplier = reverse[previousNumber.toString().replace('*', '')] ? previousNumber.toString().replace('*', '') : undefined; | ||
var nextCharacterArabic = (numbers[characters[i + 1]] || 0).toString().replace('*', ''); | ||
if ( | ||
// not a multiplier like '*100': | ||
typeof arabic === 'number' && | ||
// in the 1-9 range: | ||
arabic > 0 && arabic < 10 && | ||
// previous character is 10, 100, 1000 or 10000: | ||
previousCharacterAsMultiplier !== undefined && | ||
// e.g. 1000 < 10000 for 8千3萬, or it's the last character in string: | ||
(parseInt(previousCharacterAsMultiplier) < parseInt(nextCharacterArabic) || characters[i + 1] === undefined) && | ||
// For numbers like 十五, there are no other units to be appended at the end | ||
previousCharacterAsMultiplier !== '10' | ||
) { | ||
// E.g. for 8千3, add 百: | ||
var oneOrderSmaller = (parseInt(previousCharacterAsMultiplier) / 10).toString(); | ||
var missingMultiplier = reverse[oneOrderSmaller]; | ||
result += character + missingMultiplier; | ||
} | ||
else { | ||
result += character; | ||
} | ||
} | ||
}); | ||
module.exports = ChineseNumber; |
{ | ||
"name": "chinese-numbers-converter", | ||
"version": "1.0.2", | ||
"version": "2.0.0", | ||
"description": "Converts Chinese numerals in a string into Arabic numerals.", | ||
@@ -5,0 +5,0 @@ "main": "chinese-numbers.js", |
20029
398