[C#] 문자열 형식을 사용하여 소수점 이하 2 자리 또는 간단한 정수 표시

때로는 100 또는 100.99 또는 100.9 일 수있는 가격 필드가 표시됩니다. 원하는 것은 해당 가격에 소수를 입력 한 경우에만 소수점 이하 2 자리로 가격을 표시하는 것입니다. 예를 들어 100 인 경우에만 100을 100.00이 아니라 100으로 표시하고 가격이 100.2 인 경우 100.22와 유사하게 100.20을 표시해야합니다. 나는 googled하고 몇 가지 예를 보았지만 원하는 것과 정확히 일치하지 않았다.

// just two decimal places
String.Format("{0:0.00}", 123.4567);      // "123.46"
String.Format("{0:0.00}", 123.4);         // "123.40"
String.Format("{0:0.00}", 123.0);         // "123.00"



답변

우아하지 않은 방법은 다음과 같습니다.

var my = DoFormat(123.0);

DoFormat같은되는 :

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;
    }
}

우아하지는 않지만 일부 프로젝트의 비슷한 상황에서 나를 위해 일하고 있습니다.


답변

이 질문을 다시 활성화하여 죄송하지만 여기에서 정답을 찾지 못했습니다.

숫자 서식을 지정 0하면 필수 장소 및 #선택적 장소로 사용할 수 있습니다 .

그래서:

// just two decimal places
String.Format("{0:0.##}", 123.4567);      // "123.46"
String.Format("{0:0.##}", 123.4);         // "123.4"
String.Format("{0:0.##}", 123.0);         // "123"

0와 결합 할 수도 있습니다 #.

String.Format("{0:0.0#}", 123.4567)       // "123.46"
String.Format("{0:0.0#}", 123.4)          // "123.4"
String.Format("{0:0.0#}", 123.0)          // "123.0"

이 형식화 방법은 항상 사용됩니다 CurrentCulture. 일부 문화권의 .경우로 변경됩니다 ,.

원래 질문에 대한 답변 :

가장 간단한 솔루션은 @Andrew ( here ) 에서 제공됩니다 . 그래서 개인적으로 다음과 같은 것을 사용합니다.

var number = 123.46;
String.Format(number % 1 == 0 ? "{0:0}" : "{0:0.00}", number)


답변

이것은 일반적인 형식의 부동 숫자 사용 사례입니다.

불행히도, 모든 내장 된 한 글자 형식 문자열 (예 : F, G, N)은이를 직접 달성하지 못합니다.
예를 들어 num.ToString("F2")항상 같은 소수점 이하 두 자리를 표시 123.40합니다.

0.##조금 자세하게 보이더라도 패턴 을 사용해야 합니다.

완전한 코드 예제 :

double a = 123.4567;
double b = 123.40;
double c = 123.00;

string sa = a.ToString("0.##"); // 123.46
string sb = b.ToString("0.##"); // 123.4
string sc = c.ToString("0.##"); // 123


답변

오래된 질문이지만 내 의견으로는 가장 간단한 옵션을 추가하고 싶었습니다.

천 단위 구분 기호가 없는 경우 :

value.ToString(value % 1 == 0 ? "F0" : "F2")

천 단위 구분 :

value.ToString(value % 1 == 0 ? "N0" : "N2")

동일하지만,과 및 String.format :

String.Format(value % 1 == 0 ? "{0:F0}" : "{0:F2}", value) // Without thousands separators
String.Format(value % 1 == 0 ? "{0:N0}" : "{0:N2}", value) // With thousands separators

여러 곳 에서 필요한 경우 확장 방법 으로이 논리를 사용합니다 .

public static string ToCoolString(this decimal value)
{
    return value.ToString(value % 1 == 0 ? "N0" : "N2"); // Or F0/F2 ;)
}


답변

시험

double myPrice = 123.0;

String.Format(((Math.Round(myPrice) == myPrice) ? "{0:0}" : "{0:0.00}"), myPrice);


답변

어쨌든 형식 지정자에 조건을 넣는 방법을 모르지만 자신의 포맷터를 작성할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
               // all of these don't work
            Console.WriteLine("{0:C}", 10);
            Console.WriteLine("{0:00.0}", 10);
            Console.WriteLine("{0:0}", 10);
            Console.WriteLine("{0:0.00}", 10);
            Console.WriteLine("{0:0}", 10.0);
            Console.WriteLine("{0:0}", 10.1);
            Console.WriteLine("{0:0.00}", 10.1);

          // works
            Console.WriteLine(String.Format(new MyFormatter(),"{0:custom}", 9));
            Console.WriteLine(String.Format(new MyFormatter(),"{0:custom}", 9.1));
            Console.ReadKey();
        }
    }

    class MyFormatter : IFormatProvider, ICustomFormatter
    {
        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            switch (format.ToUpper())
            {
                case "CUSTOM":
                    if (arg is short || arg is int || arg is long)
                        return arg.ToString();
                    if (arg is Single || arg is Double)
                        return String.Format("{0:0.00}",arg);
                    break;
                // Handle other
                default:
                    try
                    {
                        return HandleOtherFormats(format, arg);
                    }
                    catch (FormatException e)
                    {
                        throw new FormatException(String.Format("The format of '{0}' is invalid.", format), e);
                    }
            }
            return arg.ToString(); // only as a last resort
        }

        private string HandleOtherFormats(string format, object arg)
        {
            if (arg is IFormattable)
                return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture);
            if (arg != null)
                return arg.ToString();
            return String.Empty;
        }

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


답변

다음은 동일한 메소드 호출을 유지하는 Uwe Keim의 메소드에 대한 대안입니다.

var example1 = MyCustomFormat(123.1);  // Output: 123.10
var example2 = MyCustomFormat(123.95); // Output: 123.95
var example3 = MyCustomFormat(123);    // Output: 123

MyCustomFormat같은되는 :

public static string MyCustomFormat( double myNumber )
{
    var str (string.Format("{0:0.00}", myNumber))
    return (str.EndsWith(".00") ? str.Substring(0, strLastIndexOf(".00")) : str;
}