C # с арабского на английский код дает мне ошибку - PullRequest
0 голосов
/ 08 января 2012

Может кто-нибудь помочь мне исправить эту ошибку, которую я использую, используя VS2010 ASP.Net C # 3.0. Я обнаружил, что это может быть в сети, но оно не работает, поскольку выдает ошибку, как показано на снимке экрана.Я не могу понять сообщение об ошибке

Код ссылки от http://weblogs.asp.net/abdullaabdelhaq/archive/2009/06/27/displaying-arabic-number.aspx

КОД:

 protected void Button1_Click(object sender, System.EventArgs e)
    {   //Call Function
        this.Label1.Text = "Arabic Number : <b>" + TranslateNumerals(this.TextBox1.Text) + "</b>";
    }


    public static string TranslateNumerals(string sIn)
    {
        System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
        System.Text.Decoder utf8Decoder = null;
        utf8Decoder = enc.GetDecoder();
        dynamic sTranslated = new System.Text.StringBuilder();
        char[] cTransChar = new char[2];
        byte[] bytes = {217,160 };
        // Start Converting characters into Arabic mode.

        char[] aChars = sIn.ToCharArray();
        foreach (char c in aChars)
        {
            if (char.IsDigit(c))
            {
                bytes[1] = 160 + Convert.ToInt32(char.GetNumericValue(c));
                utf8Decoder.GetChars(bytes, 0, 2, cTransChar, 0);
                sTranslated.Append(cTransChar[0]);
            }
            else
            {
                sTranslated.Append(c);
            }
        }
        return sTranslated.ToString();
    }

enter image description here

Ответы [ 2 ]

0 голосов
/ 08 января 2012

Компилятор жалуется на ваш запрос о неявном преобразовании результата сложения целых чисел (160 + Convert.ToInt32...) в байт. Это сужающееся обращение; целые числа имеют более широкий диапазон, чем байты, и компилятор хочет, чтобы вы с помощью явного оператора приведения подтвердили, что вы знаете, что это может привести к ошибкам во время выполнения.

Если предположить, что добавление 160 на самом деле делает что-то полезное для персонажа, я бы посоветовал использовать что-то вроде этого.

if (c >= '0' && c <= '9')
{
    bytes[i] = (byte)((int)c + 160);
}

... который должным образом выдаст в качестве i-го значения массива bytes байт со значением 160, большим, чем char c, если c представляет цифру ASCII между 0 и 9.

Не использовать функцию char.IsDigit, которая вернет истину, даже если c - это цифра вне диапазона цифр ASCII. Я не особо сталкиваюсь с этим, но, поскольку вы явно пишете многоязычный код, вы захотите разобраться с этим случаем.

Я не просмотрел оставшуюся часть поста, на который вы ссылаетесь, но, учитывая эти две вполне очевидные ошибки, я бы не стал верить в правильность остальной части, честно говоря.

0 голосов
/ 08 января 2012

Вы можете добавить приведение типа (byte) перед 160.

Я немного запутался, почему для этого требуется такая большая функция.

Обновленный ответ: Учитывая, что существует только 10 возможных цифр для преобразования, вы можете сделать что-то вроде этого, чтобы сделать его немного более читабельным. Я думаю, в любом случае, я обычно не пишу код на C #, и я сейчас на Mac ... не стесняйтесь bash мой код.

public static string TranslateNumerals(string sIn)
{
  var sb = new System.Text.StringBuilder();
  char[] arabic = { '٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'};
  foreach (char c in sIn) {
    int idx;
    // if it wasn't a number, just append it, otherwise convert it
    if(!Integer.tryParse("" + c, idx)) {
      sb.Append(c);
    } else {
      sb.Append(arabic[idx]);
    }
  }
  return sb.toString();
}

// backwards array (which appears frontwards here)
{ '٩','٨','٧','٦','٥','٤','٣', '٢', '١', '٠'};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...