// Library for converting numbers to various Chinese representations. // See: // http://www.mandarintools.com/numbers.html // http://en.wikipedia.org/wiki/Chinese_numerals // class ChineseNumbers { // Dictionaries that store the styles. class var casual = ChineseNumbers.initializeCasual[] class var formal = ChineseNumbers.initializeFormal[] // Initialize the casual dictionary class initializeCasual[] := { casual = new dict casual@"0" = "\u96F6" casual@"1" = "\u4e00" casual@"2" = "\u4e8c" casual@"3" = "\u4e09" casual@"4" = "\u56db" casual@"5" = "\u4e94" casual@"6" = "\u516d" casual@"7" = "\u4e03" casual@"8" = "\u516b" casual@"9" = "\u4e5d" casual@"10"= "\u5341" casual@"100" = "\u767e" casual@"1000" = "\u5343" casual@"10000" = "\u4e07" return casual } // Initialize the formal dictionary class initializeFormal[] := { formal = new dict formal@"0" = "\u96F6" formal@"1" = "\u58F9" formal@"2" = "\u8cb3" formal@"3" = "\u53c4" formal@"4" = "\u8086" formal@"5" = "\u4f0d" formal@"6" = "\u9678" formal@"7" = "\u67D2" formal@"8" = "\u634C" formal@"9" = "\u7396" formal@"10"= "\u62fe" formal@"100" = "\u4f70" formal@"1000" = "\u4edf" formal@"10000" = "\u842c" return formal } // Get string corresponding to casual Chinese writing. class formatCasual[num is dimensionless] := { return format[num, casual] } // Get string corresponding to formal Chinese writing. class formatFormal[num is dimensionless] := { return format[num, formal] } // Function to format according to style. class format[num, dict, hasLeading=false] := { ret = formatTenThousands[num, dict, false] re = subst["(.)" + dict@"0" + "+$", "$1"] // Remove trailing zeroes ret =~ re re = subst[dict@"0" + "{2,}", dict@"0"] // Remove doubled zeroes ret =~ re } // Format ten-thousands place class formatTenThousands[num, dict, hasLeading] := { digits = num div 10000 remainder = num mod 10000 if digits == 0 if !hasLeading return formatThousands[remainder, dict, false] else return dict@"0" + formatThousands[remainder, dict, true] return format[digits,dict,true] + dict@"10000" + formatThousands[remainder, dict, true] } // Format thousands place class formatThousands[num, dict, hasLeading] := { digit = num div 1000 remainder = num mod 1000 if digit == 0 if !hasLeading return formatHundreds[remainder, dict, false] else return dict@"0" + formatHundreds[remainder, dict, true] return dict@"$digit" + dict@"1000" + formatHundreds[remainder, dict, true] } // Format hundreds place class formatHundreds[num, dict, hasLeading] := { digit = num div 100 remainder = num mod 100 if digit == 0 if !hasLeading return formatTens[remainder, dict, false] else return dict@"0" + formatTens[remainder, dict, true] return dict@"$digit" + dict@"100" + formatTens[remainder, dict, true] } // Format tens place class formatTens[num, dict, hasLeading] := { digit = num div 10 remainder = num mod 10 if digit == 0 if !hasLeading return formatOnes[remainder, dict, false] else return dict@"0" + formatOnes[remainder, dict, true] if digit == 1 // Special case for 11-99 if !hasLeading return dict@"10" + formatOnes[remainder, dict, true] return dict@"$digit" + dict@"10" + formatOnes[remainder, dict, true] } // Format ones place class formatOnes[num, dict, hasLeading] := { if num == 0 if !hasLeading // No leading, return zero character return dict@"0" else // Has leading, skip if zero return "" return dict@"$num" // Normal case } }