如何只删除不是数字的字符串的第一个字符? (MFC, C++)

How do I remove only the first character of a string that is not a digit? (MFC, C++)

我只想删除字符串中不是数字的第一个字符。第一个字符可以是从“A”到“Z”的任何字符,也可以是特殊字符,如“&”或“#”。此遗留代码是用 MFC 编写的。我查看了 CString class 但无法弄清楚如何使它起作用。

我的字符串可能类似于以下任何一种: J22008943452GF 或 22008943452GF 或 K33423333333IF 或 23000526987IF 或 #12000895236GF。你现在明白了。

我的困境是我需要删除所有字符串第一个位置的字符,但不是以数字开头的字符串。对于以数字开头的字符串,我需要保留它们。此外,不应更改字符串中其他字符的 none。例如,不应更改字符串后面部分的“G”、“I”或“F”。字符串的长度将始终为 13 或 14 位数字。

这是我目前的情况。

CString GAbsMeterCalibration::TrimMeterSNString (CString meterSN)
 {
   meterSN.MakeUpper();
   CString TrimmedMeterSNString = meterSN;
   int strlength = strlen(TrimmedMeterSNString);

    if (strlength == 13)
       {
         // Check the first character anyway, even though it’s
         //  probably okay.  If it is a digit, life’s good.
         //  Return unaltered TrimmedMeterSNString;
       }

    if (strlength == 14)) 
       {
           //Check the first character, it’s probably going
           //  to be wrong and is a character, not a digit.  

           // if I find a char in the first postion of the
           //    string, delete it and shift everything to the 
           //    left.  Make this my new TrimmedMeterSNString
           //  return altered TrimmedMeterSNString;
        }
 }

在调用之前检查并验证字符串长度。

根据我的调查,我发现 MFC 没有正则表达式 class。它也没有子字符串方法。

怎么样:

CString GAbsMeterCalibration::TrimMeterSNString (CString meterSN)
 {
   meterSN.MakeUpper();
   CString TrimmedMeterSNString = meterSN;
   int strlength = strlen(TrimmedMeterSNString);

    if (std::isdigit(TrimmedMeterSNString.GetAt(0)) )
       {
         // Check the first character anyway, even though it’s
         //  probably okay.  If it is a digit, life’s good.
         //  Return unaltered TrimmedMeterSNString;
       }
 }

据我了解,如果不是数字,您想删除第一个字母。所以你可以让这个功能更简单:

CString GAbsMeterCalibration::TrimMeterSNString(CString meterSN)
{
    meterSN.MakeUpper();

    int length = meterSN.GetLength();

    // just check the first character is always a digit else remove it
    if (length > 0 && unsigned(meterSN[0] - TCHAR('0')) > unsigned('9'))
    {
        return meterSN.Right(length - 1);
    }

    return meterSN;
}

我没有使用函数 isdigit 而不是使用 unsigned 的条件技巧,因为 CString 使用的 TCHAR 可以是 charwchar_t.

CString test="12355adaddfca";
if((test.GetAt(0)>=48)&&(test.GetAt(0)<=57))
{
//48 and 57 are ascii values of 0&9, hence this is a digit
//do your stuff
 //CString::GetBuffer may help here??
}
else
{
//it is not a digit, do your stuff

}

比较字符串第一个位置的ascii值,就知道是不是数字了..

我不知道你是否尝试过这个,但是,它应该有效。

CString str = _T("#12000895236GF");
//  check string to see if it starts with digit.
CString result = str.SpanIncluding(_T("0123456789"));
//  if result is empty, string does not start with a number
//  and we can remove the first character.  Otherwise, string
//  remains intact.
if (result.IsEmpty())
    str = str.Mid(1);

似乎比建议的要简单一些。

解决方案相当简单:

CString GAbsMeterCalibration::TrimMeterSNString(CString meterSN) {
    meterSN.MakeUpper();
    return _istdigit(meterSN.GetAt(0)) ? meterSN :
                                         meterSN.Mid(1);
}

可以使用 _istdigit. This is required since you are using CString, which stores either MBCS or Unicode character strings. The desired substring is extracted using CStringT::Mid.

为 ANSI 和 Unicode 项目设置编译实现

(请注意,CString 是特定 CStringT 模板实例化的类型定义,具体取决于您的项目设置。)