2012-09-03 143 views
1

我需要格式化布爾值作爲多語言支持「Ja」/「Nein」的字符串。女巫是我需要DisplayFormat和EditFormat的正確格式字符串嗎? 我使用DevExpress和repositoryItemTextEdit作爲設計中的列編輯器,但我認爲它與任何其他綁定字符串格式相同。還有另一種方法嗎?自定義字符串格式

回答

4

您應該將字面值「Ja」/「Nein」提取到本地化資源中。 老人作出了很好的迴應,但我會用一些例子來擴展它。

首先,定義自定義格式提供,將使用定位在某種

public class LocalizedBoolFormatter : IFormatProvider, ICustomFormatter 
{ 
    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     bool value = (bool)arg; 
     format = (format == null ? null : format.Trim().ToLower()); 

     switch (format) 
     { 
      case "yn": 
       return GetLocalizedBool(value); 
      default: 
       return HandleDefaultFormat(arg, format, formatProvider); 
     } 
    } 

    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 
     else 
      return null; 
    } 
} 

LocalizedBoolFormatter私有方法可能如下:

private string HandleDefaultFormat(object value, string format, IFormatProvider formatProvider) 
{ 
    if (value is IFormattable) 
     return ((IFormattable)value).ToString(format, formatProvider); 
    else 
     return value.ToString(); 
} 

private string GetLocalizedBool(bool value) 
{ 
    //extract from localization resources 
    //or use CultureInfo.CurrentCulture for poors man localization 
    return value ? "Ja" : "Nein"; 
} 

然後,你可以簡單地使用自定義格式器格式值,其將由格式化器本地化

bool f = false; 
string formatted = string.Format(new LocalizedBoolFormatter(), "{0:yn}", f); 
Console.WriteLine (formatted); 

W第i個DevExpress的RepositoryItemTextEdit可以使用Custom Formatting如下:

repositoryItemTextEdit.DisplayFormat.Format = new LocalizedBoolFormatter(); 
repositoryItemTextEdit.DisplayFormat.FormatType = FormatType.Custom; 
3

布爾值不能自動轉換爲當前語言環境。你可以使用一個擴展方法將其轉化:

public static string ToPrettyString(this bool value) { 
    return value ? YourResource.TrueValue : YourResource.FalseValue; 
} 

如果您需要更多的靈活性,檢查答案Boolean Format String - Yes/No instead of True/False那裏,也可以實現IFormatProvider的例子。

1

的easyest的方法是使用一個不同的屬性或列的格式化值。 您還可以使用數據綁定的分析/格式事件:

repositoryItemTextEdit1.DataBindings[0].Format += new ConvertEventHandler(repositoryItemTextEdit1_Format); 

repositoryItemTextEdit1.DataBindings[0].Parse += new ConvertEventHandler(repositoryItemTextEdit1_Parse); 

void repositoryItemTextEdit1_Format(object sender, ConvertEventArgs e) 
{ 
    return e.Value ? "Ja" : "Nein"; 
} 

void repositoryItemTextEdit1_Parse(object sender, ConvertEventArgs e) 
{ 
    return e.Value.Equals("Ja") ? yes : no; 
}