Skip to content

Instantly share code, notes, and snippets.

@faridfor
Created December 21, 2019 10:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save faridfor/bff976f66523ff5a8d7cd14781e3ea07 to your computer and use it in GitHub Desktop.
Save faridfor/bff976f66523ff5a8d7cd14781e3ea07 to your computer and use it in GitHub Desktop.
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