2011-01-17 2 views
1

Мне нужно проанализировать количество как десятичное число и код валюты как строку.Нужен совет, анализирующий десятичное значение из строки

Входная строка

302 600.00 RUB 
10 000.00 USD 

Узор

  1. QUANTITY-> пространственно-> CurrencyCode
  2. двух знаков после запятой
  3. Пространство как разделителя, точки в качестве десятичного разделителя
+0

Возможный дубликат [Помогите мне разобрать следующий формат файла] (http://stackoverflow.com/questions/4712052/help-me-parsing-the-following-file-format) –

+0

Возможно, вам понадобится регулярное выражение для это –

+0

Хенк, в этом вопросе я спрашивал, как разбирать значение и тег. Здесь я задаю другой вопрос, как разобрать конкретную ценность. Я думаю, что было бы лучше разделить это на два вопроса, если вы считаете, что лучше иметь его в качестве одного вопроса, я удалю этот вопрос и обновить первый. –

ответ

1

Вы можете использовать Regex с аккумуляторами, пользовательские NumberFormat

string pattern = @"(?<decimal>[0-9]{0,3}(\s[0-9]{3})*(.[0-9]+){0,1})\s" + 
       @"(?<currency>[a-zA-Z]+){1}"; 

string input = "302 600.00 RUB\r\n10 000.00 USD"; 

// Get text that matches regular expression pattern. 
MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); 

NumberFormatInfo format = new NumberFormatInfo(); 
format.NumberGroupSeparator = " "; 
format.NumberDecimalSeparator = "."; 
format.NumberDecimalDigits = 2; 

Dictionary<string, decimal> dictionary = new Dictionary<string, decimal>(); 
foreach (Match match in matches) 
{ 
    dictionary.Add(match.Groups["currency"].Value, Decimal.Parse(match.Groups["decimal"].Value, format));  
} 
if (dictionary.Count > 0) 
{ 
    foreach (KeyValuePair<string, decimal> item in dictionary) 
    { 
     Console.WriteLine("Currency : {0} Amount: {1}", item.Key, item.Value); 
    } 
} 

Выход:

Currency : RUB Amount: 302600,00 
Currency : USD Amount: 10000,00 
1

Этот не проверяется, но вы можете сделать что-то подобное.

string text = "302 600.00 RUB"; 
decimal amount; 
string type; 

var lastspace = text.lastIndexOf(" ");  
decimal.TryParse(text.substring(0, lastspace - 1), out amount); 
type = text.substring(lastspace + 1); 

Надеюсь, это поможет.

+0

О, отлично. String.LastIndex, вот что мне нужно. –

+0

Теперь вопрос номер два: «302 600.00 руб.». Здесь text.lastIndexOf не работает. –

1
using System.Text.RegularExpressions; 

[...]

string sInput = "302 10 600.00 RUB"; 
// string sInput = "302 600.00 RUB"; 
// string sInput = "10 000.00 USD"; 

var rgmResult = Regex.Match(sInput, @"^(?<qty>\d+) (?<price>\d{1,3}(\d{3})*\.\d{2}) (?<cur>[A-Z]{3})$"); 
string sQuantity = rgmResult.Groups["qty"].Value; 
string sPrice = rgmResult.Groups["price"].Value; 
string sCurrency = rgmResult.Groups["cur"].Value; 
+0

Ouch @ "^ (? [0-9] +) (? [0-9] {1,3} ([0-9] {3}) * \. [0-9] {2}) (? [AZ] {3}) $ «выглядит противно! Может быть, единственный способ, хотя –

+0

Это цена, которую нужно заплатить (ни каламбур!), Чтобы получить это правильно :) –

Смежные вопросы