형식에 따라 문자열의 서식을 지정하려고합니다 ...하지만보기 흉한 것 같습니다. 누구든지 좀 더 세련된 승인을 받기 위해 어떤 설득을 가지고 있습니까?문자열 서식 지정을 수정하는 데 도움이 필요합니다.
답변
왜 과부하 메서드가 아닌가요?
using System;
namespace test {
static class Formatter {
const string DateFormat = "MMM dd yyyy";
const string NumberFormat = "0.0";
public static string Format(double d) {
return d.ToString(NumberFormat);
}
public static string Format(DateTime d) {
return d.ToString(DateFormat);
}
// most generic method
public static string Format(object o) {
return o.ToString();
}
}
class Program {
public static void Main() {
Console.WriteLine(Formatter.Format(2.0d));
Console.WriteLine(Formatter.Format(DateTime.Now));
// an integer => no specific function defined => pick the
// most generic overload (object)
Console.WriteLine(Formatter.Format(4));
}
}
}
참고 : 당신이 유형을 비교해야하는 경우가
if (typeof(int) == t){
// ...
}
를 사용해야하고, 유형 이름에 비교를 수행 (또는 적어도, 당신이 그것을 할 경우, 완전히 을 확인하지를 자격이 부여 된 유형 이름 (예 : 네임 스페이스 포함).
편집
기능> 유형 - 사전 사용, 계정 알론의 의견을 고려한 대안 솔루션 :이 두 번째 솔루션으로
using System;
using System.Collections.Generic;
namespace test {
public class Formatter {
delegate string FormatFunction(object o);
private string FormatDouble(object o) {
double d = (double)o;
return d.ToString("0.0");
}
private string FormatDateTime(object o) {
DateTime d = (DateTime)o;
return d.ToString("MMM dd yyyy");
}
// map types to format function
private Dictionary<Type, FormatFunction> _formatters = new Dictionary<Type, FormatFunction>();
public Formatter() {
_formatters.Add(typeof(double), FormatDouble);
_formatters.Add(typeof(DateTime), FormatDateTime);
}
public string Format(object o) {
Type t = o.GetType();
if (_formatters.ContainsKey(t)){
return _formatters[t](o);
} else {
return o.ToString();
}
}
}
class Program {
public static void Main() {
Formatter f = new Formatter();
Console.WriteLine(f.Format(2.0d));
Console.WriteLine(f.Format(DateTime.Now));
Console.WriteLine(f.Format(4));
}
}
}
, 당신은 올바른 기능을 얻을 방금 경우에도를 객체에 대한 참조 (가능한 경우 첫 번째 솔루션을 사용합니다).
나는 내 일반적인 솔루션보다이 옵션을 더 좋아합니다. –
대단히, 내가받은 가장 멋진 의견을 보내 주셔서 감사합니다. –
이 메소드를 호출 한 사람이 ToString-ed가 될 필요가있는 객체 참조만을 보유하고 있으면이 기능이 작동하지 않지만 꽤 좋았습니다. 예 : void PrintDebugVar (string name, object var) {Debug.WriteLine (string.Format ("{0} = {1}", name, Formatter.Format (var))); } –
string Format<T>(T value)
{
Type[] numericTypes = new Type[] {typeof(double), typeof(single)};
if (Array.IndexOf(numericTypes, typeof(T)))
return string.Format("{0:0.0}", value);
else if (typeof(T) is DateTime)
return string.Format("{0:MMM dd yyyy}", value);
else
return value.ToString();
}
string DateFormat = "MMM dd yyyy";
string NumberFormat = "0.0";
string FormatString(Type t, object value)
{
string output = "";
switch (t.Name.ToUpper())
{
case "DATETIME":
output = ((DateTime)value).ToString(DateFormat);
break;
case "SINGLE":
output = ((Single)value).ToString(NumberFormat);
break;
case "DOUBLE":
output = ((Double)value).ToString(NumberFormat);
break;
default:
output = value.ToString();
break;
}
return output;
}
당신은 닷넷 3.0을 사용하고있는 이상 내가 조금이라도 더 좋은 것을 확인 할 수 있습니다.
.NET 2.0 이상 (예 : Generics)을 의미한다고 생각합니다. –
거기에 약간의 린크를 뿌리고 싶었던 거지? ;-) –
'typeof (T) is DateTime'은 항상 거짓 일 것입니다.'T is DateTime' 또는'typeof (T) == typeof (DateTime)'을 의미하지 않았습니까? –
제공된 두 개의 다른 솔루션은 제공된 인수의 정적 유형에 따라 적절한 형식을 호출해야하는 경우에 유용합니다. 그러나 객체의 런타임 유형에 따라 형식을 지정해야하는 경우에는 작동하지 않습니다. 원래의 시도는 좋았지 만, 그런 식으로 유형을 비교하는 것이 최선의 방법은 아닙니다. 대신에 'is'키워드를 사용하십시오 :
public static string FormatObject(object obj)
{
if (obj is DateTime)
return ((DateTime)obj).ToString("MMM dd yyyy");
else if (obj is float || obj is double)
return (obj as IFormattable).ToString("0.0", new System.Globalization.NumberFormatInfo());
else return obj.ToString();
}
사실 내가 제공 한 두 번째 솔루션은 객체의 런타임 유형에 따라 서식을 지정하는데 ... 그게 뭐가 잘못 되었나요? –
그래, 편집 한 솔루션은 런타임 유형을 확인하지. 그러나 그것을 봐라. - 당신이 메소드 오버로드를 사용하기를 주장하기 때문에 그것이 크고 복잡하다는 사실을 제외하고는 비싸고 (* .GetType()) 리플렉션을 사용하고 스레드가 아닌 공유 상태를 저장하고 유지한다. 그러한 단순한 문제에 대해 안전하고 검소하며 심지어 제정신이 아닙니다.코드에서 이와 비슷한 문제가 발생한다면, 그것이 무엇을하는지 깨닫기까지 몇 분이 걸릴 것입니다. 그리고 유지 보수성과 가독성을 위해 솔루션으로 다시 작성하겠습니다. –
리플렉션 대 '관련'키워드 실적에 대한 링크를 포함하는 것을 잊어 버렸습니다. http://gabewishnie.blogspot.com/2005/10/is-and-as-lesser-known-c-keywords.html –
- 1. MySQL의 쿼리를 수정하는 데 도움이
- 2. SVN을 수정하는 데 도움이 필요합니다 : "작업 디렉토리가 아닙니다"
- 3. 크롬/사파리의 CSS 버그를 수정하는 데 도움이 필요합니다.
- 4. XML 파일을 수정하는 데있어 regex 도움이 필요합니다.
- 5. Django로 시작하는 데 도움이 필요합니다.
- 6. 버튼을 작동시키는 데 도움이 필요합니다.
- 7. 반복자를 사용하는 데 도움이 필요합니다.
- 8. 문자열 변수 조작에 도움이 필요합니다.
- 9. 은 문자열 파싱에 도움이 필요합니다.
- 10. 프로젝트 오일러 문제를 해결하는 데 도움이 필요합니다.
- 11. Java에서 문자열이 인스턴스인지 확인하는 데 도움이 필요합니다.
- 12. 다시 Inputstream에서 데이터를 읽는 데 도움이 필요합니다
- 13. C 함수를 이해하는 데 도움이 필요합니다
- 14. 다른 wchar_t를 추가하는 데 도움이 필요합니다! C++
- 15. 창이 열리는 문제를 해결하는 데 도움이 필요합니다
- 16. PDF 내보내기를 제대로 수행하는 데 도움이 필요합니다.
- 17. 대리자를 사용하여 UITableView를 변경하는 데 도움이 필요합니다.
- 18. gprof 출력을 암호 해독하는 데 도움이 필요합니다.
- 19. 배열을 테이블 뷰에 추가하는 데 도움이 필요합니다.
- 20. Slider 팝업 창을 얻는 데 도움이 필요합니다
- 21. jQuery를 noConflict 모드로 이식하는 데 도움이 필요합니다.
- 22. tcpdump 출력을 해석하는 데 도움이 필요합니다.
- 23. NSURLConnection. 데이터를 저장하는 데 도움이 필요합니다.
- 24. Windows에서 python-cdb를 설치하는 데 도움이 필요합니다.
- 25. C#을 VB로 번역하는 데 도움이 필요합니다.
- 26. C++을 C로 변환하는 데 도움이 필요합니다.
- 27. 함수에 변수를 보내는 데 도움이 필요합니다 PHP
- 28. 3tier 디자인으로 시작하는 데 도움이 필요합니다.
- 29. iOS 앱의 버전을 이해하는 데 도움이 필요합니다.
- 30. 은 시간 슬롯을 생성하는 데 도움이 필요합니다.
형식을 CurrentCulture로 설정하고 포맷터로 처리 할 수 있습니까? – tvanfosson