Created
March 17, 2024 07:30
-
-
Save codesfromshad/f92f43ffaee8b142e32ae6925d123e44 to your computer and use it in GitHub Desktop.
A TypeScript function to convert numbers to Bengali words.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @license ISC License (ISC) | |
* | |
* Copyright (c) 2021 Maruf Hassan. | |
* | |
* Permission to use, copy, modify, and/or distribute this software for any | |
* purpose with or without fee is hereby granted, provided that the above | |
* copyright notice and this permission notice appear in all copies. | |
* | |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
* SOFTWARE. | |
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | |
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | |
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | |
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | |
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE | |
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |
* PERFORMANCE OF THIS SOFTWARE. | |
* | |
* GitHub Repository: | |
* [number-to-bengali-words](https://github.com/maruf571/number-to-bengali-words) | |
*/ | |
const NEGATIVE = "ঋণাত্মক"; | |
const DECIMAL = " দশমিক"; | |
const ONE_HUNDRED = 100; | |
const ONE_THOUSAND = 1000; | |
const ONE_LAKH = 100000; | |
const ONE_CRORE = 10000000; | |
const number2WordMap: Record<number, string> = { | |
0 : "শূন্য", | |
1 : "এক", | |
2 : "দুই", | |
3 : "তিন", | |
4 : "চার", | |
5 : "পাঁচ", | |
6 : "ছয়", | |
7 : "সাত", | |
8 : "আট", | |
9 : "নয়", | |
10 : "দশ", | |
11 : "এগারো", | |
12 : "বারো", | |
13 : "তেরো", | |
14 : "চৌদ্দ", | |
15 : "পনের", | |
16 : "ষোল", | |
17 : "সতের", | |
18 : "আঠার", | |
19 : "উনিশ", | |
20 : "বিশ", | |
21 : "একুশ", | |
22 : "বাইশ", | |
23 : "তেইশ", | |
24 : "চব্বিশ", | |
25 : "পঁচিশ", | |
26 : "ছাব্বিশ", | |
27 : "সাতাশ", | |
28 : "আটাশ", | |
29 : "ঊনত্রিশ", | |
30 : "ত্রিশ", | |
31 : "একত্রিশ", | |
32 : "বত্রিশ", | |
33 : "তেত্রিশ", | |
34 : "চৌত্রিশ", | |
35 : "পঁয়ত্রিশ", | |
36 : "ছত্রিশ", | |
37 : "সাইত্রিশ", | |
38 : "আটত্রিশ", | |
39 : "ঊনচল্লিশ", | |
40 : "চল্লিশ", | |
41 : "একচল্লিশ", | |
42 : "বিয়াল্লিশ", | |
43 : "তেতাল্লিশ", | |
44 : "চুয়াল্লিশ", | |
45 : "পঁয়তাল্লিশ", | |
46 : "ছিচল্লিশ", | |
47 : "সাতচল্লিশ", | |
48 : "আটচল্লিশ", | |
49 : "ঊনপঞ্চাশ", | |
50 : "পঞ্চাশ", | |
51 : "একান্ন", | |
52 : "বাহান্ন", | |
53 : "তেপ্পান্ন", | |
54 : "চুয়ান্ন", | |
55 : "পঞ্চান্ন", | |
56 : "ছাপ্পান্ন", | |
57 : "সাতান্ন", | |
58 : "আটান্ন", | |
59 : "ঊনষাট", | |
60 : "ষাট", | |
61 : "একষট্টি", | |
62 : "বাষট্টি", | |
63 : "তেষট্টি", | |
64 : "চৌষট্টি", | |
65 : "পঁয়ষট্টি", | |
66 : "ছেষট্টি", | |
67 : "সাতষট্টি", | |
68 : "আটষট্টি", | |
69 : "ঊনসত্তর", | |
70 : "সত্তর", | |
71 : "একাত্তর", | |
72 : "বাহাত্তর", | |
73 : "তেহাত্তর", | |
74 : "চুয়াত্তর", | |
75 : "পঁচাত্তর", | |
76 : "ছিয়াত্তর", | |
77 : "সাতাত্তর", | |
78 : "আটাত্তর", | |
79 : "ঊনআশি", | |
80 : "আশি", | |
81 : "একাশি", | |
82 : "বিরাশি", | |
83 : "তিরাশি", | |
84 : "চুরাশি", | |
85 : "পঁচাশি", | |
86 : "ছিয়াশি", | |
87 : "সাতাশি", | |
88 : "আটাশি", | |
89 : "উননব্বই", | |
90 : "নব্বই", | |
91 : "একানব্বই", | |
92 : "বিরানব্বই", | |
93 : "তিরানব্বই", | |
94 : "চুরানব্বই", | |
95 : "পঁচানব্বই", | |
96 : "ছিয়ানব্বই", | |
97 : "সাতানব্বই", | |
98 : "আটানব্বই", | |
99 : "নিরানব্বই", | |
100 : "শত", | |
1000 : "হাজার", | |
100000 : "লক্ষ", | |
10000000 : "কোটি", | |
}; | |
/** | |
* This function converts a number to Bengali words. Thanks to | |
* [Maruf Hassan](https://github.com/maruf571/) for his solution. | |
* | |
* Converted to TypeScript by | |
* [Shadman Chowdhury](https://github.com/codesfromshad/). | |
* | |
* @param number - A number to convert to Bengali words. | |
* @returns A string of Bengali words. | |
* | |
* @example | |
* //Convert an integer to Bengali words | |
* console.log(toBengaliWords(123)); // Outputs: "একশ তেইশ" | |
* | |
* // Convert a floating-point number to Bengali words | |
* console.log(toBengaliWords(45.67)); // Outputs: "পঁয়তাল্লিশ দশমিক ছয় সাত" | |
* | |
* // Convert a negative number to Bengali words | |
* console.log(toBengaliWords(-200)); // Outputs: "ঋণাত্মক দুইশ" | |
*/ | |
const numberToBengaliWords = function( | |
number: number, | |
) { | |
let words = ""; | |
if (!isFinite(number)) { | |
throw new TypeError( | |
"Not a finite number: " + number + " (" + typeof number + ")" | |
); | |
} | |
if (!isSafeNumber(number)) { | |
throw new RangeError( | |
"Input is not a safe number, it’s either too large or too small." | |
); | |
} | |
const num = parseInt(number.toString(), 10); | |
words = generateWords(num); | |
if (!isInt(number)) { | |
const point = number.toString().split(".")[1]; | |
if (point) { | |
words += DECIMAL; | |
for (const digit of point) { | |
words += " " + number2WordMap[+digit]; | |
} | |
} | |
} | |
return words; | |
}; | |
function generateWords(number: number, words?: string[]): string { | |
let remainder = 0; | |
let word = ""; | |
if(number === 0){ | |
return !words ? (number2WordMap[0] ?? "শূন্য") : words.join(" ").replace(/,$/, ""); | |
} | |
if (!words) { | |
words = []; | |
} | |
if (number < 0) { | |
words.push(NEGATIVE); | |
number = Math.abs(number); | |
} | |
if (number < ONE_HUNDRED) { | |
remainder = 0; | |
word = number2WordMap[number] ?? "[unknown]"; | |
} | |
else if (number < ONE_THOUSAND) { | |
remainder = number % ONE_HUNDRED; | |
word = (number2WordMap[Math.floor(number / ONE_HUNDRED)] ?? "[unknown]") + number2WordMap[ONE_HUNDRED]; | |
} | |
else if (number < ONE_LAKH) { | |
remainder = number % ONE_THOUSAND; | |
word = number2WordMap[Math.floor(number / ONE_THOUSAND)] + " " + number2WordMap[ONE_THOUSAND]; | |
} | |
else if (number < ONE_CRORE) { | |
remainder = number % ONE_LAKH; | |
word = number2WordMap[Math.floor(number/ONE_LAKH)] + " " + number2WordMap[ONE_LAKH]; | |
} else { | |
remainder = number % ONE_CRORE; | |
word = generateWords(Math.floor(number / ONE_CRORE)) + " " + number2WordMap[ONE_CRORE]; | |
} | |
words.push(word); | |
return generateWords(remainder, words); | |
} | |
function isFinite(value: number) { | |
return !(typeof value !== "number" || value !== value || value === Infinity || value === -Infinity); | |
} | |
const MAX_SAFE_INTEGER = 9007199254740991; | |
function isSafeNumber(value: number) { | |
return typeof value === "number" && Math.abs(value) <= MAX_SAFE_INTEGER; | |
} | |
function isInt(n: number) { | |
return n % 1 === 0; | |
} | |
export default numberToBengaliWords; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment