Last active
February 1, 2016 14:55
-
-
Save kamyar1979/1ed21463207ff8e8a5a7 to your computer and use it in GitHub Desktop.
Read numbers (Persian)
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
namespace Extensions | |
{ | |
using System; | |
using System.Text; | |
using System.Text.RegularExpressions; | |
/// <summary> | |
/// This class is in charge of reading numbers into culture specific text phrases. | |
/// </summary> | |
public static class NumberReader | |
{ | |
/// <summary> | |
/// Reads each 3 digit part due to universal decimal laws. | |
/// </summary> | |
/// <param name="number">3-digit number</param> | |
/// <returns>The read number as string</returns> | |
public static string Read3Digits(int number) | |
{ | |
StringBuilder result = new StringBuilder(); | |
byte digit = 0; | |
string part = string.Empty; | |
if (number == 0) | |
{ | |
return UI.Widgets.Resources.Ordinal._0; | |
} | |
digit = (byte)(number / 100); | |
if (number >= 100) | |
{ | |
part = UI.Widgets.Resources.Ordinal.ResourceManager.GetString((digit * 100).ToString("_#")); | |
if (part != null) | |
{ | |
result.Append(part); | |
} | |
else | |
{ | |
result | |
.Append(UI.Widgets.Resources.Ordinal.ResourceManager.GetString(digit.ToString("_#"))) | |
.Append(UI.Widgets.Resources.Ordinal._100); | |
} | |
number %= 100; | |
} | |
if (number >= 10) | |
{ | |
digit = (byte)(number / 10); | |
if (result.Length > 0) | |
{ | |
result.Append(UI.Widgets.Resources.Ordinal.Joiner); | |
} | |
part = UI.Widgets.Resources.Ordinal.ResourceManager.GetString(number.ToString("_#")); | |
if (part != null) | |
{ | |
result.Append(part); | |
number = 0; | |
} | |
else | |
{ | |
part = UI.Widgets.Resources.Ordinal.ResourceManager.GetString((digit * 10).ToString("_#")); | |
if (part != null) | |
{ | |
result.Append(part); | |
} | |
else | |
{ | |
result | |
.Append(UI.Widgets.Resources.Ordinal.ResourceManager.GetString(digit.ToString("_#"))) | |
.Append(UI.Widgets.Resources.Ordinal._10); | |
} | |
} | |
number %= 10; | |
} | |
if (number > 0) | |
{ | |
if (result.Length > 0) | |
{ | |
result.Append(UI.Widgets.Resources.Ordinal.Joiner); | |
} | |
result.Append(UI.Widgets.Resources.Ordinal.ResourceManager.GetString(number.ToString("_#"))); | |
} | |
return result.ToString(); | |
} | |
/// <summary> | |
/// Reads an integer number. | |
/// </summary> | |
/// <param name="number">The integer number</param> | |
/// <returns>Read number as string</returns> | |
public static string ReadNumber(Int64 number) | |
{ | |
int numOfParts = 0; | |
int partDigits = 0; | |
StringBuilder result = new StringBuilder(); | |
bool lastNotZero; | |
if (number == 0) | |
{ | |
return UI.Widgets.Resources.Ordinal._0; | |
} | |
numOfParts = (int)(Math.Log10(number) / 3); | |
while (numOfParts >= 0) | |
{ | |
lastNotZero = (partDigits != 0); | |
partDigits = (int)(number / (int)Math.Pow(10, numOfParts * 3)); | |
if (lastNotZero) | |
{ | |
result.Append(UI.Widgets.Resources.Ordinal.Joiner); | |
} | |
result.Append(Read3Digits(partDigits)); | |
if ((numOfParts > 0) && (partDigits > 0)) | |
{ | |
result | |
.Append(' ') | |
.Append(UI.Widgets.Resources.Logarithm.ResourceManager.GetString((numOfParts * 3).ToString("_#"))); | |
} | |
number %= int.Parse('1' + new string('0', numOfParts * 3)); | |
numOfParts--; | |
} | |
return result.ToString(); | |
} | |
/// <summary> | |
/// Reads a double precision number. | |
/// </summary> | |
/// <param name="number">Given number</param> | |
/// <returns>Read number as string</returns> | |
public static string ReadNumber(double number) | |
{ | |
string result = string.Empty; | |
var match = Regex.Match(number.ToString(), @"(\d+)\.?(\d+)?"); | |
if (Int64.Parse(match.Groups[1].Value) != 0) | |
{ | |
result += ReadNumber(Int64.Parse(match.Groups[1].Value)); | |
} | |
if (match.Groups[2].Value != string.Empty) | |
{ | |
result += UI.Widgets.Resources.Ordinal.Joiner + ReadNumber(Int64.Parse(match.Groups[2].Value)) + ' ' + UI.Widgets.Resources.Logarithm.ResourceManager.GetString(match.Groups[2].Value.Length.ToString("_#_")); | |
} | |
return result; | |
} | |
/// <summary> | |
/// Extension method for reading double precision numbers. | |
/// </summary> | |
/// <param name="value">The number itself.</param> | |
/// <param name="nullValue">The string to return if number is null.</param> | |
/// <returns>Read number as string.</returns> | |
public static string Read(this double? value, string nullValue = "") | |
{ | |
if (value == null) | |
{ | |
return nullValue; | |
} | |
else | |
{ | |
return ReadNumber(value.Value); | |
} | |
} | |
/// <summary> | |
/// Extension method for reading decimal numbers. | |
/// </summary> | |
/// <param name="value">The number itself.</param> | |
/// <param name="nullValue">The string to return if number is null.</param> | |
/// <returns>Read number as string.</returns> | |
public static string Read(this decimal? value, string nullValue = "") | |
{ | |
if (value == null) | |
{ | |
return nullValue; | |
} | |
else | |
{ | |
return ReadNumber((double)value.Value); | |
} | |
} | |
} | |
} |
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
var cardinal = { | |
_1:'یک', | |
_2:'دو', | |
_3:'سه', | |
_4:'چهار', | |
_5:'پنج', | |
_6:'شش', | |
_7:'هفت', | |
_8:'هشت', | |
_9:'نه', | |
_0:'صفر', | |
_10:'ده', | |
_11:'یازده', | |
_12:'دوازده', | |
_13:'سیزده', | |
_14:'چهارده', | |
_15:'پانزده', | |
_16:'شانزده', | |
_17:'هفده', | |
_18:'هجده', | |
_19:'نوزده', | |
_20:'بیست', | |
_30:'سی', | |
_40:'چهل', | |
_50:'پنجاه', | |
_60:'شصت', | |
_70:'هفتاد', | |
_80:'هشتاد', | |
_90:'نود', | |
_100:'صد', | |
_200:'دویست', | |
_300:'سیصد', | |
_400:'چهارصد', | |
_500:'پانصد', | |
joiner: ' و ', | |
minues: 'منفی'}; | |
var logarithm = { | |
_1_:'دهم', | |
_12:'بیلیون', | |
_15:'تریلیون', | |
_2_:'صدم', | |
_3:'هزار', | |
_3_:'هزارم', | |
_6:'میلیون', | |
_9: 'میلیارد' | |
}; | |
var half = 'نیم'; | |
function read3Digits(number) { | |
var result = ''; | |
var digit; | |
var part = ''; | |
if(number == 0) { | |
return cardinal._0; | |
} | |
digit = Math.floor(number / 100); | |
if (number >= 100) { | |
part = cardinal['_' + (digit * 100).toString()]; | |
if (part != null) { | |
result += part; | |
} | |
else { | |
result += cardinal['_' + digit] + cardinal._100; | |
} | |
number %= 100; | |
} | |
if (number >= 10) { | |
digit = Math.floor(number / 10); | |
if (result.length > 0) { | |
result += cardinal.joiner; | |
} | |
part = cardinal['_' + number]; | |
if (part != null) { | |
result += part; | |
number = 0; | |
} | |
else { | |
part = cardinal['_' + (digit * 10).toString()]; | |
if (part != null) { | |
result += part; | |
} | |
else { | |
result += cardinal['_' + digit] + cardinal._10; | |
} | |
} | |
number %= 10; | |
} | |
if (number > 0) { | |
if(result != '') | |
result += cardinal.joiner; | |
result += cardinal['_' + number]; | |
} | |
return result; | |
} | |
function readIntegerNumber(number) { | |
var numOfParts; | |
var partDigits = 0; | |
var result = ''; | |
var lastNotZero = false; | |
if(number == 0) { | |
return cardinal._0; | |
} | |
numOfParts = Math.floor(Math.log(number) / (3 * Math.log(10))); | |
while (numOfParts >= 0) { | |
lastNotZero = (partDigits != 0); | |
partDigits = Math.floor(number / Math.floor(Math.pow(10, numOfParts * 3))); | |
if (lastNotZero) { | |
result += cardinal.joiner; | |
} | |
result += read3Digits(partDigits); | |
if ((numOfParts > 0) && (partDigits > 0)) | |
{ | |
result += ' ' + logarithm['_' + (numOfParts * 3).toString()]; | |
} | |
number %= Number('1' + new Array(numOfParts * 3 + 1).join('0')); | |
numOfParts--; | |
} | |
return result; | |
} | |
function readNumber(number) { | |
var result = ''; | |
if (typeof(number) == 'number' && number == 0) { | |
return cardinal._0; | |
} | |
if (number === undefined || number == null || number == '') { | |
return ''; | |
} | |
if(number < 0) { | |
return cardinal.minues + readNumber(-number); | |
} | |
var re = /(\d+)\.?(\d+)?/; | |
var match = re.exec(number.toString()); | |
if (match) { | |
if (Number(match[1])) | |
result += readIntegerNumber(Number(match[1])); | |
if (match[2]) { | |
if (result != '') | |
result += cardinal.joiner; | |
if (match[2] == '5') { | |
result += half; | |
} | |
else { | |
result += readIntegerNumber(Number(match[2])) + ' ' + logarithm['_' + match[2].length + '_']; | |
} | |
} | |
} | |
return result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment