Используйте приведенный ниже код, чтобы решить вашу проблему (этот код конвертирует только ваше изображение в круговое изображение, а не для просмотра текстуры):
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;
}
}
Мне пришлось писать код для проверки валюты вручную. Лично для фреймворка, который гордится своими встроенными функциями глобализации, удивительно, что .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;
}
Это разрешает тысячи, потому что значение по умолчанию NumberStyles
, используемое Decimal.Parse
( NumberStyles.Number
), включает ] NumberStyles.AllowThousands
.
Если вы хотите запретить использование разделителей тысяч, вы можете просто удалить этот флаг, например:
Decimal.Parse("1,2,3,4", NumberStyles.Number ^ NumberStyles.AllowThousands)
(приведенный выше код вызовет исключение InvalidFormatException
, что является что вы хотите, да?)
Вы могли бы сделать это в двухэтапном процессе. Сначала вы можете проверить разделитель тысяч, используя информацию в CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator
и CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes
, вызывая исключение, если оно не проходит, а затем передать число в Decimal.Parse ()
;