Преобразование строки в двойное, так что я могу фильтровать по значению списка - PullRequest
0 голосов
/ 30 марта 2020

В настоящее время у меня есть строковое свойство Monthly, которое представляет собой вычисление с плавающей запятой, которое затем распространяется на строку. Как только все мои свойства будут сохранены, я хочу отфильтровать их с помощью Monthly. При этом я считаю, что мне нужно конвертировать Monthly в double, но при этом я получаю исключение, говорящее «Входная строка была в неправильном формате». Ниже мой код ...

 protected override void OnAppearing()
    {
        base.OnAppearing();
        using (SQLiteConnection conn = new SQLiteConnection(App.FilePath))
        {
            conn.CreateTable<MainWindowViewModel>();
            var APRS = conn.Table<MainWindowViewModel>().ToList().OrderBy(APR => Convert.ToDecimal(APR.Monthly));

            APRListView.ItemsSource = APRS;


        }
    }

Конечно, я не могу преобразовать его обратно в строку?

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Существует хотя бы одно значение, которое нельзя преобразовать в десятичное число. Вы можете попробовать обходной путь, например:

protected override void OnAppearing()
    {
        base.OnAppearing();
        using (SQLiteConnection conn = new SQLiteConnection(App.FilePath))
        {
            conn.CreateTable<MainWindowViewModel>();
            var APRS = conn.Table<MainWindowViewModel>()
                .ToList()
                .OrderBy(APR => decimal.TryParse(APR.Monthly, out decimal m)?m:0);

            APRListView.ItemsSource = APRS;
        }
    }

РЕДАКТИРОВАТЬ: Вы можете добавить параметры к этому TryParse, чтобы проанализировать для определенной культуры c, а также включить символы для валюты и c.

РЕДАКТИРОВАТЬ: я вижу, что у вас есть £ в ваших значениях, вероятно, обозначает валюты в Великобритании:

protected override void OnAppearing()
    {
        base.OnAppearing();
        using (SQLiteConnection conn = new SQLiteConnection(App.FilePath))
        {
            conn.CreateTable<MainWindowViewModel>();
            var APRS = conn.Table<MainWindowViewModel>()
                .ToList()
                .OrderBy(APR => decimal.TryParse(APR.Monthly, System.Globalization.NumberStyles.Currency, new CultureInfo("en-GB"), out decimal m)?m:0);

            APRListView.ItemsSource = APRS;
        }
    }
1 голос
/ 31 марта 2020

Храните и используйте значение как двойное в первую очередь. Когда вам нужно это как строку, для отображения, затем легко конвертируйте ее в строку, вызывая ToString на двойном элементе, и тогда вы можете добавить £ в начало строки, например:

"£" + doubleValue.ToString()

или

$"£{doubleValue.ToString()}"

В качестве альтернативы, если вам нужно или вы действительно хотите сохранить значение в виде строки с запятой, начинающейся с символа £, то вам необходимо сначала обрезать символ £ перед преобразованием в удвоение, например:

double doubleValue = Convert.ToDouble(stringValue.Replace("£", ""));
1 голос
/ 31 марта 2020

добавить в модель только для чтения свойство для обработки преобразования

public decimal MonthlyDecimal 
{
  get 
  {
    try {
      return Convert.ToDecimal(Monthly);
    } catch (Exception ex) {
      return 0;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...