Десятичное число C#. Проблема синтаксического анализа с запятыми

Используйте приведенный ниже код, чтобы решить вашу проблему (этот код конвертирует только ваше изображение в круговое изображение, а не для просмотра текстуры):

 public class ImageConverter {

    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return output;
    }
}
21
задан Eduardo Scoz 6 May 2009 в 21:01
поделиться

3 ответа

Мне пришлось писать код для проверки валюты вручную. Лично для фреймворка, который гордится своими встроенными функциями глобализации, удивительно, что .NET не может с этим справиться.

Мое решение приведено ниже. Он работает для всех локалей в структуре. Однако он не поддерживает отрицательные числа, как указал Орион ниже. Как вы думаете, ребята?

    public static bool TryParseCurrency(string value, out decimal result)
    {
        result = 0;
        const int maxCount = 100;
        if (String.IsNullOrEmpty(value))
            return false;

        const string decimalNumberPattern = @"^\-?[0-9]{{1,{4}}}(\{0}[0-9]{{{2}}})*(\{0}[0-9]{{{3}}})*(\{1}[0-9]+)*$";

        NumberFormatInfo format = CultureInfo.CurrentCulture.NumberFormat;

        int secondaryGroupSize = format.CurrencyGroupSizes.Length > 1
                ? format.CurrencyGroupSizes[1]
                : format.CurrencyGroupSizes[0];

        var r = new Regex(String.Format(decimalNumberPattern
                                       , format.CurrencyGroupSeparator==" " ? "s" : format.CurrencyGroupSeparator
                                       , format.CurrencyDecimalSeparator
                                       , secondaryGroupSize
                                       , format.CurrencyGroupSizes[0]
                                       , maxCount), RegexOptions.Compiled | RegexOptions.CultureInvariant);
        return !r.IsMatch(value.Trim()) ? false : Decimal.TryParse(value, NumberStyles.Any, CultureInfo.CurrentCulture, out result);
    }

И вот один тест, показывающий, что это работает (nUnit):

    [Test]
    public void TestCurrencyStrictParsingInAllLocales()
    {
        var originalCulture = CultureInfo.CurrentCulture;
        var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
        const decimal originalNumber = 12345678.98m;
        foreach(var culture in cultures)
        {
            var stringValue = originalNumber.ToCurrencyWithoutSymbolFormat();
            decimal resultNumber = 0;
            Assert.IsTrue(DecimalUtils.TryParseCurrency(stringValue, out resultNumber));
            Assert.AreEqual(originalNumber, resultNumber);
        }
        System.Threading.Thread.CurrentThread.CurrentCulture = originalCulture;

    }
10
ответ дан 29 November 2019 в 21:41
поделиться

Это разрешает тысячи, потому что значение по умолчанию NumberStyles , используемое Decimal.Parse ( NumberStyles.Number ), включает ] NumberStyles.AllowThousands .

Если вы хотите запретить использование разделителей тысяч, вы можете просто удалить этот флаг, например:

Decimal.Parse("1,2,3,4", NumberStyles.Number ^ NumberStyles.AllowThousands)

(приведенный выше код вызовет исключение InvalidFormatException , что является что вы хотите, да?)

14
ответ дан 29 November 2019 в 21:41
поделиться

Вы могли бы сделать это в двухэтапном процессе. Сначала вы можете проверить разделитель тысяч, используя информацию в CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator и CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes , вызывая исключение, если оно не проходит, а затем передать число в Decimal.Parse () ;

1
ответ дан 29 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: