2012-09-03 102 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; 
}