Skip to content

Instantly share code, notes, and snippets.

@kamyar1979
Last active February 1, 2016 14: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 kamyar1979/1ed21463207ff8e8a5a7 to your computer and use it in GitHub Desktop.
Save kamyar1979/1ed21463207ff8e8a5a7 to your computer and use it in GitHub Desktop.
Read numbers (Persian)
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);
}
}
}
}
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