2012-08-28 101 views
8

已經創建了自己的號碼類型(實際上DoubleDouble),我要實現的IFormattable接口。所以我必須以某種方式解析格式字符串。支護的ToString(字符串格式)與自定義數字型

public string ToString(string format, IFormatProvider formatProvider) { 
    // formatting string according to format and using formatprovider? 
    return formattedString; 
} 

類的用戶應該能夠用它作爲double替換(或任何其他數字格式)。

String.Format("{0:0.##}", (DoubleDouble)123.4567); 

我的問題是,有人知道一個很好的教程或可以給我一些提示嗎? 如何在此過程中支持本地化?

如何解析格式字符串?有沒有一些方法可以幫助完成這項任務,還是我必須通過正則表達式「手」來完成這一切?

我真的在尋找幫助,但找不到任何東西,如果你發現有其他語言的東西(C,C++)可能有幫助,請告訴我關於它的信息。

+1

我開始使用標準字符串之前,我上了自定義品種。本地化呢? http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx – Jodrell

+0

我發現這很有用 - http://codebetter.com/davidhayden/2006/03/12/open-closed-principle-iformattable- iformatprovider-icustomformatter/ –

+0

我已經有了一個返回科學記數法的ToString方法。我面臨的問題是,如何解析格式字符串並返回相應的數字。給定的鏈接只使用非常基本的修飾符。 –

回答

0

如何支持在這個過程中定位?

類似以下內容:

public string ToString(string format, IFormatProvider formatProvider) 
{ 
    CultureInfo culture = formatProvider as CultureInfo; 
    if (culture != null) 
    { 
    // Now you can do things like 
    // culture.NumberFormat.NumberDecimalSeparator, etc. 
    } 
} 

如何解析格式字符串?有沒有一些方法在這個 來幫助完成任務或做我有一個正則表達式和這樣做這一切的「手」?

在.NET框架中沒有公共的API來爲你做。如果你看一下source爲.NET原始數字類型實施IFormattable,他們都最終調用外部方法,所以他們沒有提供見解。你可能需要使用像RegEx這樣的東西來解析格式字符串。然後,您可以用10的最大功率除以找出輸出的第一位數,將其減去,然後重複執行10的較小功率,直到生成所有數字。

0

也許這可以幫助你:

var my = DoFormat(123.0) 

public static string DoFormat(double myNumber) 
{ 

    var s = string.Format("{0:0.00}", myNumber); 

    if (s.EndsWith("00")) 
    { 
     return ((int)myNumber).ToString(); 
    } 
    else 
    { 
     return s; 
    } 
} 
1

MSDN有Temperature類,它實現了IFormattable接口有自己的自定義格式的nice example

我想你已經知道這一點;無論如何,今天我才知道,如果你的DoubleDouble類實現的IFormattable接口,那麼:

String.Format("{0:0.##}", (DoubleDouble)123.4567); 

...會調用DoubleDouble類的ToString(...)實現與作爲第一個參數,我懷疑的特定格式"0.##"接近什麼你要。儘管如此,你仍然必須解析這部分格式。

我會冒險猜測,大部分格式解析深深植入高度優化的.Net庫二進制文件中,因此您無法獲得任何自定義解析虛擬方法來提供幫助。

+0

好的,我剛剛意識到Nate對上述問題的評論已經鏈接到一個很好的教程。我的最後一段是這裏唯一的新事物。 – wardies

0

幾年前,我寫了一個JavaScript數字格式化函數,它模仿了大多數解析格式字符串的.NET方法。這可能對您編寫C#版本有所幫助。至少它可以給你一個起點。

https://github.com/flamewave/jquery-ui-numeric/blob/master/jquery-ui-numeric.js

滾動全部下到谷底到$ .formatNumber功能的方式。

注:我贊成使用Globalize庫,這也可能給你一些洞察解析格式字符串不再保留這個功能。