bGuruprasad.com
bGuruprasad.com

Reputation: 362

Convert Unicode string made up of culture-specific digits to integer value

I am developing a program in the Marathi language. In it, I want to add/validate numbers entered in Marathi Unicode by getting their actual integer value.

For example, in Marathi:

How do I convert this Marathi string "४५" to its actual integer value i.e. 45?

I googled a lot, but found nothing useful. I tried using System.Text.Encoding.Unicode.GetString() to get string and then tried to parse, but failed here also.

Upvotes: 6

Views: 2279

Answers (4)

Roger Johansson
Roger Johansson

Reputation: 23214

Quick hack of @Alexi's response.

public static double ParseValue(string value)
{
    return double.Parse(string.Join("",
        value.Select(c => "+-.".Contains(c)
           ? "" + c: "" + char.GetNumericValue(c)).ToArray()),
        NumberFormatInfo.InvariantInfo);
}

calling ParseValue("१२३.३२१") yields 123.321 as result

Upvotes: 2

Eric MSFT
Eric MSFT

Reputation: 3276

Windows.Globalization.DecimalFormatter will parse different numeral systems in addition to Latin, including Devanagari (which is what is used by Marathi).

Upvotes: 0

bGuruprasad.com
bGuruprasad.com

Reputation: 362

I found my solution... The following code will convert given Marathi number to its equivalent Latin number..
Thanks to @Alexei, I just changed some of your code and its working fine..

 string ToLatinDigits(string nativeDigits)
    {
        int n = nativeDigits.Length;
        StringBuilder latinDigits = new StringBuilder(capacity: n);
        for (int i = 0; i < n; ++i)
        {
            if (char.IsDigit(nativeDigits, i))
            {
                latinDigits.Append(char.GetNumericValue(nativeDigits, i));
            }
            else if (nativeDigits[i].Equals('.') || nativeDigits[i].Equals('+') || nativeDigits[i].Equals('-'))
            {
                latinDigits.Append(nativeDigits[i]);
            }
            else
            {
                throw new Exception("Invalid Argument");
            }
        }
        return latinDigits.ToString();
    }

This method is working for both + and - numbers.
Regards Guruprasad

Upvotes: 0

Alexei Levenkov
Alexei Levenkov

Reputation: 100527

Correct way would be to use Char.GetNumericValue that lets you to convert individual characters to corresponding numeric values and than construct complete value. I.e. Char.GetNumericValue('९') gives you 9.

Depending on your goal it may be easier to replace each national digit character with corresponding invariant digit and use regular parsing functions.

Int32.Parse("९९".Replace("९", "9"))

Upvotes: 4

Related Questions