Created
December 21, 2019 10:55
-
-
Save faridfor/bff976f66523ff5a8d7cd14781e3ea07 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
import android.text.TextUtils | |
import java.math.BigDecimal | |
import kotlin.math.min | |
object PersianNumbersToLettersConverter { | |
private var splitter = " و " | |
private var words = arrayListOf( | |
arrayListOf("", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه"), | |
arrayListOf("ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هجده", "نوزده"), | |
arrayListOf("", "", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود"), | |
arrayListOf("", "یکصد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد"), | |
arrayListOf("", " هزار ", " میلیون ", " میلیارد ", " بیلیون ", " بیلیارد ", " تریلیون ", " تریلیارد ", " کوآدریلیون ", " کادریلیارد ", " کوینتیلیون ", " کوانتینیارد ", " سکستیلیون ", " سکستیلیارد ", " سپتیلیون ", " سپتیلیارد ", " اکتیلیون ", " اکتیلیارد ", " نانیلیون ", " نانیلیارد ", " دسیلیون ")) | |
private fun prepareNumber(number: String): ArrayList<String> { | |
val length = number.length % 3 | |
var resultNumber = number | |
if (length == 1) resultNumber = "00$number" | |
else if (length == 2) resultNumber = "0$number" | |
return splitStringBySize(resultNumber) | |
} | |
private fun splitStringBySize(str: String): ArrayList<String> { | |
val split = ArrayList<String>() | |
for (i in 0 until str.length / 3) | |
split.add(str.substring(i * 3, min((i + 1) * 3, str.length))) | |
return split | |
} | |
private fun threeNumbersToLetter(num: String): String { | |
if (num.isBlank()) return num | |
val parsedInt = num.toInt() | |
when { | |
parsedInt < 10 -> return words[0][parsedInt] | |
parsedInt < 20 -> return words[1][parsedInt - 10] | |
parsedInt < 100 -> { | |
val one = parsedInt % 10 | |
val ten = (parsedInt - one) / 10 | |
return if (one > 0) words[2][ten] + splitter + words[0][one] | |
else words[2][ten] | |
} | |
else -> { | |
val one = parsedInt % 10 | |
val hundreds = (parsedInt - parsedInt % 100) / 100 | |
val ten = (parsedInt - (hundreds * 100 + one)) / 10 | |
val out = ArrayList<String?>() | |
out.add(words[3][hundreds]) | |
val secondPart = ten * 10 + one | |
if (secondPart > 0) | |
when { | |
secondPart < 10 -> out.add(words[0][secondPart]) | |
secondPart < 20 -> out.add(words[1][secondPart - 10]) | |
else -> { | |
out.add(words[2][ten]) | |
if (one > 0) | |
out.add(words[0][one]) | |
} | |
} | |
return TextUtils.join(splitter, out) | |
} | |
} | |
} | |
fun getParsedString(input: String): String { | |
return try { | |
val zero = "صفر" | |
if ("0" == input) return zero | |
if (input.length > 66) return input | |
val processedInput = BigDecimal(input.replace("[^\\d.]".toRegex(), "")).toString() | |
val splitNumber = prepareNumber(processedInput) | |
val result = ArrayList<String?>() | |
val splitLength = splitNumber.size | |
for (i in 0 until splitLength) { | |
val sectionTitle = words[4][splitLength - (i + 1)] | |
val converted = threeNumbersToLetter(splitNumber[i]) | |
if ("" != converted) result.add(converted + sectionTitle) | |
} | |
TextUtils.join(splitter, result) | |
} catch (e: Exception) { | |
"" | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment