C #의 문자열에서 마지막 문자를 제거합니다. 우아한 방법?


84

이와 같은 숫자 문자열이 2223,00있습니다. 나는 그것을 2223. 이것은 " , " 뒤에 정보가 없습니다 . " , " 뒤에 소수 두 자리 만 있다고 가정합니다 .

나는했다 :

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

더 우아한 해결책이 있습니까? 다른 기능을 사용할까요? -명시적인 숫자를 넣는 것을 좋아하지 않습니다-

답변:


173

실제로 하나의 매개 변수를 사용하는 Remove 오버로드를 사용할 수 있습니다.

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

그러나 길이를 하드 코딩하지 않으려면 다음을 사용할 수 있습니다.

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

좋은 답변을 많이 받았습니다. 그러나 이것은 우아함 측면에서 사용할 것입니다. 그럼에도 불구하고 낮은 수준 에서 어느 것이 더 효율적 인지 모르겠습니다 . 따라서 선택하십시오!
Kani 2011

6
두 번째 솔루션은 읽기, 이해 및 유지 관리가 훨씬 쉬우 며 낮은 수준의 성능 측면 에서 그 차이는 엄청나게 미미합니다. ,가 항상 위치 -3에 있다는 것을 알고 있다면 첫 번째 솔루션은 여전히 ​​괜찮지 만 조기 최적화 는 시간을 낭비하는 끔찍한 일입니다.
Scott Rippey 2011

2
@Kani 첫 번째가 가장 효율적이지만 Scott과 완전히 동의합니다. 프로파일 링 후 성능이 있다는 것을 알지 못하면 항상 두 번째를 선택합니다. 여기에 병목 현상이 있습니다. 이 두 가지 (및 대부분의 다른 답변)는 매우 빠르며 거의 모든 목적에 충분합니다.
Reed Copsey 2011

쉼표가 없으면 문자열을 수정하지 않기를 원한다고 가정하십시오.
Kyle Delaney

15

아마도 이것은 :

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

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

1
@ ReedCopsey에 대해 어떻게 생각하세요? 아주 좋은 것 같아요.
Kani

@Kani : 우아함 측면에서 나는 대부분의 답변이 충분히 잘 게시 된 것을 발견했습니다 . 실제로 병목 현상이 발생 하지 않는 한 성능에도 신경 쓰지 않을 것 입니다. 고려해야 할 유일한 사항은 다른 형식으로 오는 문자열을 어떻게 처리 할 것인가입니다 ...
km

더 이상 쉼표를 사용하지 않기 때문에 2to 의 두 번째 인수를 전달하는 것이 Split좋습니다.
Richard

5

이것은 쉼표 뒤의 모든 것을 제외한 문자열을 반환합니다.

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

물론 이것은 문자열에 실제로 소수점이있는 쉼표가 있다고 가정 합니다. 그렇지 않으면 위의 코드는 실패합니다. 더 많은 확인을 원합니다.

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

나는 당신이 시작하는 문자열로 작업하고 있다고 가정하고 있습니다. 이상적으로는 float 또는 double과 같이 시작할 숫자로 작업하는 경우으로 캐스팅 int한 다음 다음 myInt.ToString()과 같이 할 수 있습니다.

myInt = (int)double.Parse(myString)

이것은 현재 문화를 사용하여 double을 구문 분석합니다 (여기서는 미국에서는 .소수점으로 사용 ). 그러나 이것은 다시 입력 문자열을 구문 분석 할 수 있다고 가정합니다.


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

초기 값이 10 진수 인 경우 문자열로 변환해야합니다.

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

이 예에서는 Invariant culture를 선택하지만 원하는 문화를 사용할 수 있습니다.

십진수에 앞으로 2 개 또는 3 개의 선행 숫자가 포함 될지 알 수 없기 때문에 서식 지정 기능을 사용하는 것을 선호합니다.

편집 :를 사용 Truncate하여, 또는.

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

글쎄, 나는이 경우에 같은 숫자를 얻고 있다. 혼수 상태빠지게 한다.
Kani

사용하는 정확한 문자열은 무엇이며 컴퓨터는 어떤 문화입니까?
Patrick Desjardins

예와 같이 : dddd, dd , 여기서 d 는 숫자입니다. 소수점 이하 자릿수는 쫓고 , 이 경우. 일부 결과를 표준화하고 . , 또는 . 대신 ,
카니

나는 이것을 개인적으로하기 위해 string.Format을 사용할지 모르겠습니다. 작동하는 동안 string.Format에 전달되기 전에 double을 박싱하여 추가 객체를 생성합니다.
Christopher Currens 2011

나는 스트링 (서브 스트링)으로 플레이하는 것과 복싱으로 플레이하는 것 사이의 성능 측면에서 무엇이 더 나은지 모른다고 말해야한다. 집중적으로 사용하지 않으면별로 중요하지 않다고 생각합니다. 상황에 따라 다름 :)
Patrick Desjardins

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

두 가지 이유로 여기에서 확장 방법을 선호합니다.

  1. Substring으로 연결할 수 있습니다. Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. 속도.

1

LastIndexOf와 Substring을 결합하여 스팅 내에서 쉼표의 마지막 인덱스 왼쪽에있는 모든 문자를 가져올 수 있습니다.

string var = var.Substring (0, var.LastIndexOf ( ','));


0

사용할 수 있습니다 TrimEnd. 효율적이고 깨끗해 보입니다.

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

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

Remove last characters from a string if this character is... 저에게 잘 맞습니다. 감사합니다. "oppa/ ".Trim().TrimEnd('/');
it3xl


-3

lastIndexOf를 사용하십시오. 처럼:

string var = var.lastIndexOf(',');

var는 변수 이름입니다. 문자열의 이름으로 사용해서는 안됩니다. -1; 또한 이것은 색인을 제공하므로 문제의 일부만 해결합니다. Remove ()가 필요합니다.
Patrick Knott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.