Двоичная Десериализация с другой версией блока

Как и другие, я добавил этот класс в свой проект и установил фильтр в 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.

26
задан Chris Ballance 4 February 2009 в 06:21
поделиться

4 ответа

Можно управлять, как бинарный форматтер разрешает свои типы путем присвоения пользовательского SerializationBinder средству форматирования. Таким образом Вы не должны будете смешивать с событиями твердости AppDomain, и Вы устраняете риск неожиданных побочных эффектов от этого.

существует подробный пример в MSDN.

22
ответ дан SteinNorheim 25 September 2019 в 07:24
поделиться

Рычаг в 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

5
ответ дан Chris Ballance 25 September 2019 в 07:24
поделиться

Существуют altenative (двоичный файл) механизмы сериализации ( как это ), которые не являются зависимым блока.

3
ответ дан Marc Gravell 25 September 2019 в 07:24
поделиться

GAC является Вашим первым ресурсом, позволяя различным версиям блока сосуществовать бок о бок. Но это ничего действительно не решает, если Ваше приложение не является версией, терпимой также. Двоичная сериализация имеет несколько функций для обработки версии терпимая сериализация. Читайте об этом в этой статье .

библиотеки MSDN
1
ответ дан Hans Passant 25 September 2019 в 07:24
поделиться
Другие вопросы по тегам:

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