所以,也许这是一个糟糕的设计; 我不知道.但是我说有一个DataTable包含int值的列; 这些值实际上是代表enum我在项目中的某种类型.
我想要做的是DataGridView绑定到这个表并让列显示的是名称enum而不是整数值"0"或"1"或其他什么.
我考虑的一个选择是做整个正常化的事情:添加在表DataSet与enum它的名称,键入的enum值,并有我的第一台坚持一个参考此表.
但这是一个enum特定的想法.我想知道,如果在一般情况下,我可以写我自己IFormatProvider,并ICustomFormatter实现*给定类型,并使用该格式来控制值的方式显示在一个给定的列DataGridView控(还是真的在任何控制,对于这个问题) .
*这就是我怀疑它会如何完成,如果我所要求的是可能的话.我根本没有完全使用这些接口.
我需要在我的ASP.NET MVC应用程序中显示货币,但当货币为0时,我希望它显示"Free"(当然是本地化的!)而不是0.00美元.
所以,当我有这样的事情......
Decimal priceFree = 0.00;
Decimal priceNotFree = 100.00;
priceFree.ToString("C");
priceNotFree.ToString("C");
Run Code Online (Sandbox Code Playgroud)
输出为"$ 0.00""$ 100.00"
我希望它是"免费""100.00美元"
我想我可以使用的ToString(字符串格式,的IFormatProvider formatProvider)方法来做到这一点,但我不知道如何去做.很明显我想重新使用尽可能多的NumberFormatInfo尽可能的和唯一覆盖它当输入为0.在这种情况下,我可以简单的返回一个包含我的"自由"的字符串的本地化资源.
那我该怎么做?
谢谢
我的对象中有一个整数值。我需要将其转换为整数值。所以我就这样做了。System.Convert.ToInt64(Object) 但FxCop说我需要提供IFormatProvider。字符串数据类型我对提供 IFormatProvider 没有任何问题。如何为整数值提供 IFormatProvider?
DateTime todayDateTime = DateTime.Now;
StringBuilder todayDateTimeSB = new StringBuilder("0");
todayDateTimeSB.Append(todayDateTime.ToString("MMddyyyy"));
long todayDateTimeLongValue = Convert.ToInt64(todayDateTimeSB.ToString());
// convert to byte array packed decimal
byte[] packedDecValue = ToComp3UsingStrings(todayDateTimeLongValue);
// append each byte to the string builder
foreach (byte b in packedDecValue)
{
sb.Append(b); // bytes 56-60
}
sb.Append(' ', 37);
Run Code Online (Sandbox Code Playgroud)
上面的代码获取当前日期时间,将其格式化为long值并将其传递给将其转换为压缩十进制格式的方法.我知道上面的工作是因为当我逐步执行代码时,字节数组对于我期望的所有字节都具有正确的十六进制值.
但是上面是我遇到问题的代码,特别是我已经研究过,发现字符串生成器.Append(byte)实际上ToString()为该字节做了一个.当它将字节添加到字符串时,这会改变字节的值.问题是我如何告诉StringBuilder它按原样取出'byte'并将其存储在内存中而不格式化/改变值.我知道还有一个.AppendFormat()有几个重载使用它IFormatProvider来提供很多很多关于如何格式化的选项,但是我没有看到任何方法告诉它不格式化/改变/改变数据的值.
为什么要使用IFormatProvider的DateTime.ParseExact,如果已经有一个格式参数?
DateTime.ParseExact(inputString, format, cultureInfo);
Run Code Online (Sandbox Code Playgroud) 为什么这段代码会抛出异常?
var dateTime = "2012-03-21_15.12";
var format = new DateTimeFormatInfo()
{
FullDateTimePattern = "yyyy-MM-dd-HH_mm.ss"
};
// FormatException: String was not recognized as a valid DateTime.
var parse = DateTime.Parse(dateTime, format);
Run Code Online (Sandbox Code Playgroud) 我有以下NLog 2.0代码来记录异常:
Dim theEvent = NLog.LogEventInfo.Create(NLog.LogLevel.Error, loggerName, message, ex)
Run Code Online (Sandbox Code Playgroud)
升级到NLog 4.1后,我看到以下警告:
函数Create(logLevel As LogLevel,loggerName As String,message As String,exception As Exception)由于LogEventInfo'已过时:'使用Create(LogLevel logLevel,string loggerName,Exception exception,IFormatProvider formatProvider,string message)'
...它要求我添加IFormatProvider formatProvider作为参数.我应该在那里添加什么?
Dim theEvent = NLog.LogEventInfo.Create(NLog.LogLevel.Error, loggerName, ex, ???, message)
Run Code Online (Sandbox Code Playgroud)