Как и другие, я добавил этот класс в свой проект и установил фильтр в EditText
, который я хочу.
Фильтр копируется из ответа @ Pixel. Я просто собираю все это вместе.
public class DecimalDigitsInputFilter implements InputFilter {
Pattern mPattern;
public DecimalDigitsInputFilter() {
mPattern = Pattern.compile("([1-9]{1}[0-9]{0,2}([0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String formatedSource = source.subSequence(start, end).toString();
String destPrefix = dest.subSequence(0, dstart).toString();
String destSuffix = dest.subSequence(dend, dest.length()).toString();
String result = destPrefix + formatedSource + destSuffix;
result = result.replace(",", ".");
Matcher matcher = mPattern.matcher(result);
if (matcher.matches()) {
return null;
}
return "";
}
}
Теперь установите фильтр в ваш EditText
, как это.
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
Здесь важна то, что он решает мою проблему, не позволяя показывать более двух цифр после десятичной точки в EditText
, но проблема в том, что когда I getText()
из этого EditText
, он возвращает весь введенный мной ввод.
Например, после применения фильтра по EditText
я попытался установить вход 1,5699856987. Таким образом, на экране это показывает 1.56, что идеально.
Затем я хотел использовать этот ввод для некоторых других вычислений, поэтому я хотел получить текст из этого поля ввода (EditText
). Когда я позвонил mEditText.getText().toString()
, он возвращает 1.5699856987, что было неприемлемо в моем случае.
Поэтому мне пришлось снова проанализировать значение после получения его из EditText
.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScale
делает трюк здесь после получения полного текста из EditText
.
Можно управлять, как бинарный форматтер разрешает свои типы путем присвоения пользовательского SerializationBinder средству форматирования. Таким образом Вы не должны будете смешивать с событиями твердости AppDomain, и Вы устраняете риск неожиданных побочных эффектов от этого.
существует подробный пример в MSDN.
Рычаг в AppDomain. Событие OnAssemblyResolve и фиксация имена сборки
private System.Reflection.Assembly OnAssemblyResolve( System.Object sender, System.ResolveEventArgs reArgs )
{
foreach( System.Reflection.Assembly assembly in System.AppDomain.CurrentDomain.GetAssemblies() )
{
System.Reflection.AssemblyName assemblyName = assembly.GetName();
if( assemblyName.FullName == reArgs.Name )
{
return( assembly );
}
}
}
источник: http://osdir.com/ml/windows.devel.dotnet.clr/2003-12/msg00441.html
Существуют altenative (двоичный файл) механизмы сериализации ( как это ), которые не являются зависимым блока.
GAC является Вашим первым ресурсом, позволяя различным версиям блока сосуществовать бок о бок. Но это ничего действительно не решает, если Ваше приложение не является версией, терпимой также. Двоичная сериализация имеет несколько функций для обработки версии терпимая сериализация. Читайте об этом в этой статье .
библиотеки MSDN