Skip to content

Instantly share code, notes, and snippets.

@codesfromshad
Created March 17, 2024 07:30
Show Gist options
  • Save codesfromshad/f92f43ffaee8b142e32ae6925d123e44 to your computer and use it in GitHub Desktop.
Save codesfromshad/f92f43ffaee8b142e32ae6925d123e44 to your computer and use it in GitHub Desktop.
A TypeScript function to convert numbers to Bengali words.
/**
* @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