2011-11-11 8 views
78

나는 2223,00과 같은 숫자 문자열을 가지고 있습니다. 나는 그것을 2223으로 바꾸고 싶다. 이것은 : 이후없이 ","정보없이. ","다음에 소수점 이하 두 자리 만 있다고 가정합니다.C#에서 문자열의 마지막 문자를 제거합니다. 우아한 방법?

은 내가 그랬어 :

str = str.Remove(str.Length - 3, 3); 

더 우아한 해결책이 있습니까? 어쩌면 다른 기능을 사용하고 있을까요? 초기 값은 문자열로 소수 인 경우 -I 명시 번호들

답변

166

당신은 실제로 하나 개의 매개 변수를 취 제거 과부하 사용할 수 있습니다 : 당신이 길이를 하드 코딩 피하려고하는 경우, 그러나

str = str.Remove(str.Length - 3); 

을, 당신은 사용할 수 있습니다

str = str.Remove(str.IndexOf(',')); 
+0

나는 많은 좋은 답변을 받았다. 그러나 이것은 내가 우아함의 측면에서 사용할 것입니다. 그럼에도 불구하고 ** 저수준 **에서는 어떤 것이 더 효율적인지 모르겠습니다. 그래서, 당신의 선택을해라! – Kani

+6

두 번째 솔루션은 읽기 쉽고 이해하기 쉬우 며 유지 관리가 쉽습니다. ** 낮은 수준의 ** 성능면에서 그 차이는 매우 미미합니다. ','가 항상 -3 위치에 있다는 것을 안다면, 첫 번째 해법은 여전히 ​​괜찮지 만, * 조숙 한 최적화 *는 시간을 낭비하는 끔찍한 일입니다. –

+2

@ 카니 첫 번째가 가장 효율적입니다. 그러나 나는 스캇과 완전히 동의합니다. 프로파일 링 후에 perf가 있다는 것을 알지 못한다면 항상 두 번째를 고를 것입니다. 병목 현상이 여기에 있습니다. 이 두 가지 (그리고 대부분의 다른 대답들)는 거의 모든 목적을 위해 충분히 빠르게 좋아질 것입니다. –

4
String.Format("{0:0}", 123.4567);  // "123" 

을 두는 것을 싫어한다,이 예에서

String.Format("{0:0}", double.Parse("3.5", CultureInfo.InvariantCulture)) //3.5 

을 변환해야합니다, 나는 고정 문화권을 선택하지만, 당신이 원하는 것을 사용할 수 있습니다.

나중에 소수점에 2 또는 3 개의 선행 숫자가 포함될 수 있는지 알 수 없으므로 서식 지정 기능을 사용하는 것이 좋습니다.

편집 : 또는 Truncate을 사용하여 또는을 모두 삭제할 수 있습니다.

Console.WriteLine(Decimal.Truncate(Convert.ToDecimal("3,5"))); 
+0

글쎄, 나는이 경우 동일한 번호를 얻고있다. – Kani

+0

정확한 문자열은 무엇이며 컴퓨터 문화는 무엇입니까? –

+0

예와 같이 : ** dddd, dd **, ** d **는 숫자입니다. 소수점은 **, ** 뒤에옵니다. 일부 결과를 표준화하고 **. ** 및 **, **를 삭제하거나 **. ** 대신 **. **을 사용합니다. – Kani

14

아마도 이것은 :

이 당신에게 쉼표 물론

str = str.Substring(0, str.IndexOf(',')); 

후 모든 것을 제외하고 문자열을 반환합니다

str = str.Split(",").First(); 
+5

또는 심지어'str.Split (",") [0]' – BoltClock

+0

나는 이것이 적어도 "지금까지는"가장 우아한 대답이라고 생각한다. –

+1

@ ReedCopsey에 관해 당신은 무엇을하나요? 나는 아주 좋은 것 같아요. – Kani

6

당신의 문자열이 실제로 쉼표를 가지고 가정 십진법. 위의 코드는 실패한 경우 실패합니다. 당신은 더 검사를 수행 할 것 :

commaPos = str.IndexOf(','); 
if(commaPos != -1) 
    str = str.Substring(0, commaPos) 

을 당신이로 시작하는 문자열로 최선을 다하고 있으리라 믿고있어.

myInt = (int)double.Parse(myString) 

이 (현재의 문화를 사용하여 이중 구문 분석 : 당신은 플로트 또는 더블처럼,로 시작하는 숫자로 작업하는 경우 이상적으로, 당신은 단지 int에 캐스팅 수, 다음 myInt.ToString()가 좋아해요 미국에서는 여기에 소수점으로 .을 사용합니다). 그러나 이것은 다시 입력 문자열이 파싱 될 수 있다고 가정합니다.

1

당신 TrimEnd을 사용할 수 있습니다. 효율적이며 깨끗하게 보입니다.

"Name,".TrimEnd(','); 
+4

그러면 문자열의 끝에있는 ','문자 만 제거됩니다. 문자열 "123,45"는 숫자로 끝나기 때문에, "123,45".TrimEnd (',')'는 "123,45"를 반환합니다. – phoog

+0

네, 사실 작동하지 않습니다./ – Kani

+0

@phoog 당신이 맞습니다. –

-2

lastIndexOf를 사용하십시오.마찬가지로 :

사용
string var = var.lastIndexOf(','); 
1

:

  1. 내가 하위 문자열 함께 체인 수 : 나는 두 가지 이유 여기를 확장 방법을 선호

    public static class StringExtensions 
    { 
        /// <summary> 
        /// Cut End. "12".SubstringFromEnd(1) -> "1" 
        /// </summary> 
        public static string SubstringFromEnd(this string value, int startindex) 
        { 
         if (string.IsNullOrEmpty(value)) return value; 
         return value.Substring(0, value.Length - startindex); 
        } 
    } 
    

    . Example: f1.Substring(directorypathLength).SubstringFromEnd(1)

  2. 속도.
0

다음을 시도해보십시오. 그것은 나를 위해 일한 :

str = str.Split(',').Last(); 
1

당신은 lastIndexOf에서도 사용할 수 및 하위 문자열이 고통에서 쉼표의 마지막 인덱스의 왼쪽에있는 모든 문자를 얻기 위해 결합.

문자열 var = var.Substring (0, var.LastIndexOf (',')));

관련 문제