2015-08-31 33 views
1

我在這個格式與數目的進口txt文件:轉換的固定長度數爲十進制.NET C#

00000000003000 
00000000009500 
00000000003000 
00000000002000 
00000000000500- 
00000000001500- 
00000000003000- 
00000000003000- 
00000000009500- 

這是最後2個字符是小數的數量。 (減號如果負值) 例如:

00000000003000 = 30.00 
00000000000500- = -5.00 

是否有這個字符串轉換爲十進制,節省我的時間寫一個函數?

謝謝。

+0

不行,你得寫一個或找到免費的圖書館是其他人已經不得不像這樣轉換數字。 – juharr

回答

9

試試這個:

String source = "00000000001500-"; 

Decimal result = Decimal.Parse(source, 
    NumberStyles.Any, // NumberStyles.Any includes trailing signs 
    CultureInfo.InvariantCulture)/100.0M; 

如果你想(對某些字段,值)小數只是改變100.0M10000.0M這些字段:

Decimal result4 = Decimal.Parse(source, 
    NumberStyles.Any, // NumberStyles.Any includes trailing signs 
    CultureInfo.InvariantCulture)/10000.0M; 
+2

不知道 – Jonesopolis

+0

不錯的解決方案。但看着同一個文件中的其他字段。我發現有數字有4位小數。例如:00000000150000- = -15.00 –

+2

在這種情況下(*四*小數位)您必須決定什麼時候應用*兩個*和什麼時候*四個*數字模式。其中一個靈魂:「if(Math.Abs​​(result)> = 100)result = 100M'; –

3

沒有什麼會針對您的確切的情況具體 - 尾隨-是特別不常見的。

我只是用這樣的:

public static decimal Parse(string val) 
{ 
    return (val.EndsWith("-") ? -1M : 1M) 
     * decimal.Parse 
      (
      val.Substring(0, 12) 
      + "." + val.Substring(12, 2), 
      CultureInfo.InvariantCulture 
      ); 
} 

或者,使用NumberStyles.AllowTrailingSign

public static decimal Parse(string val) 
{ 
    return 
    decimal.Parse 
     (
     val.Substring(0, 12) 
     + "." + val.Substring(12), 
     NumberStyles.AllowTrailingSign | NumberStyles.AllowDecimalPoint, 
     CultureInfo.InvariantCulture 
    ); 
} 
+0

謝謝,我喜歡2nd解決方案,修改後的函數參數添加小數位,這個工作完美:「val.Substring(0,14 - decimalPlace) +」。「+ val.Substring(14 - decimalPlace),」 –

1

您可以使用decimal.Parse與適當的NumberFormatInfo.NumberNegativePattern是追加減去自定義格式提供= >formatProvider.NumberNegativePattern = 3;

var formatProvider = (NumberFormatInfo)NumberFormatInfo.InvariantInfo.Clone(); 
formatProvider.NumberNegativePattern = 3; 
var numbers = File.ReadLines(yourFilePath) 
    .Select(l => l.TryGetDecimal(formatProvider)) 
    .Where(n => n.HasValue) 
    .Select(d => d.Value/100.0M); 

使用了本擴展到解析字符串中的LINQ查詢轉換爲十進制:

public static decimal? TryGetDecimal(this string item, IFormatProvider formatProvider = null, NumberStyles nStyles = NumberStyles.Any) 
{ 
    if (formatProvider == null) formatProvider = NumberFormatInfo.CurrentInfo; 
    decimal d = 0m; 
    bool success = decimal.TryParse(item, nStyles, formatProvider, out d); 
    if (success) 
     return d; 
    else 
     return null; 
} 

如果你希望所有的小數的總和,你可以使用Enumerable.Sum

decimal sum = numbers.Sum(); // 0 
相關問題