6
votes

Convertir une chaîne Unicode composée de chiffres spécifiques à la culture en une valeur entière

Je développe un programme dans la langue marathi. En cela, je souhaite ajouter / valider des chiffres entrés dans Marathi Unicode en obtenant sa valeur entière réelle.

Par exemple, à Marathi:

  • 45 = 45
  • 99 = 99

    Comment convertir cette chaîne de marathi "45" à sa valeur entière réelle I.e. 45 ?

    J'ai beaucoup googlé, mais je n'ai trouvé rien d'utile. J'ai essayé d'utiliser system.text.encoding.unicode.getstring () pour obtenir une chaîne puis a essayé d'analyser, mais a échoué ici aussi.


4 commentaires

Ressemble à un duplicata de Stackoverflow.com/Questtions/7826162/... .


Y a-t-il une logique où vous pouvez mapper des caractères vers des entiers, puis calculer à partir de là? Quelque chose comme Ansing Numéros romains


Fyi, int.parse () n'est probablement pas fonctionner dans ce cas, puisque la documentation pour NumberFormatinfo.natigégits dit: " Le jeu de caractères spécifié par le Nativentigits La propriété n'a aucun effet sur les opérations d'analyse ou de mise en forme. Seuls les chiffres latins de base 0 (U + 0030) via 9 (U + 0039) sont utilisés lors de la mise en forme ou de l'analyse valeurs numériques ou valeurs de date et d'heure. "


@Guruprasad - Vous devez accepter la réponse plutôt que de mettre {résolu} dans le titre.


4 Réponses :


4
votes

Correc correct serait d'utiliser Char.getnumericValue qui vous permet de convertir des caractères individuels en valeurs numériques correspondantes et que la construction de la valeur complète. C'est à dire. char.genumericvalue ('¥ ¯') vous donne 9.

Selon votre objectif, il peut être plus facile de remplacer chaque caractère du chiffre national avec le chiffre invariant correspondant et utilisez des fonctions d'analyse régulières. xxx


2 commentaires

C'est la bonne réponse, mais il est décevant que vous devez aller si de faible niveau, qu'avec le soutien textuel étant si bon.


@Alexei Levenkov merci pour la solution, mais le code échoue lorsque la valeur est en format décimal (comme 123,321 = latin équivalent. 123.321) ..



2
votes

Hack rapide de la réponse de @ Alexi.

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


3 commentaires

Qu'en est-il des nombres négatifs, par exemple "- 123.321" ? ;)


Merci @Roger, mais lors de l'utilisation de votre code, il me donne des erreurs suivantes 1. La meilleure méthode de la méthode surchargée pour 'String.join (String, String [])' a quelques arguments non valides 2. Impossible de convertir de 'System.collections.Generic. IEnumerable 'to' string [] 'Aidez-moi s'il vous plaît ... merci d'avance.


Ok, corrigé le problème (existe seulement dans Pre .NET 4.0) afin de fonctionner correctement maintenant



0
votes

J'ai trouvé ma solution ... Le code suivant sera converti sur le numéro Marathi à son numéro latin équivalent ..
Merci à @Alexei, je viens de modifier une partie de votre code et son bien fonctionnel ..

 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();
    }


0 commentaires

0
votes

Windows.globalisation. Decimalformatter va analyser différent Systèmes numériques dans ajout au latin, y compris Devanagari (ce qui est utilisé par Marathi).


0 commentaires