I have written a function to check if the number is fraction in either X/X or X X/X format where X is double.
Here is the code.
It's very long but I can't think of another algorithm to deal with it. So if you have an idea to optimize it, please give me your suggestions or comments.
Thank
Here is the code.
Code:
bool IsFraction(const CComBSTR bucketSize, double &result)
{
int nToken=1;
HRESULT hr = S_OK;
CComBSTR tempBucketSize(bucketSize);
//Count the token. must be 2 or 3
wcstok(tempBucketSize.m_str, _T(" /"));
while(wcstok(NULL, _T(" /")))
{
++nToken;
}
//If number token == 2, the number must be in the form X/X
if(nToken == 2)
{
CComBSTR szToken = wcstok(bucketSize.m_str, _T("/"));
CComVariant vtNumerator = szToken;
hr = vtNumerator.ChangeType( VT_R8 );
//if szToken is not number return false
if(FAILED(hr) || (vtNumerator.vt != VT_R8) || (vtNumerator.dblVal < 0.0))
return false;
//if there's no string left or the second string is not number or it's zero, return false
szToken = wcstok(NULL, _T("/"));
CComVariant vtDenominator = szToken;
hr = vtDenominator.ChangeType(VT_R8);
if(FAILED(hr) || (vtDenominator.vt != VT_R8) || (vtDenominator.dblVal <= 0.0))
return false;
//otherwise calculate number and return true
result = vtNumerator.dblVal / vtDenominator.dblVal;
return true;
}
//If number token == 3, the number must be in the form X X/X
else if(nToken == 3)
{
CComBSTR szToken = wcstok(bucketSize.m_str, _T(" "));
CComVariant vtNumber = szToken;
hr = vtNumber.ChangeType(VT_R8);
//if szToken is not number return false
if(FAILED(hr) || (vtNumber.vt != VT_R8) || (vtNumber.dblVal < 0.0))
return false;
//if there's no string left or the second string is not number, return false
szToken = wcstok(NULL, _T("/"));
CComVariant vtNumerator = szToken;
hr = vtNumerator.ChangeType(VT_R8);
if(FAILED(hr) || (vtNumerator.vt != VT_R8) || (vtNumerator.dblVal < 0.0))
return false;
//if there's no string left or the third string is not number or it's zero, return false
szToken = wcstok(NULL, _T(" /"));
CComVariant vtDenominator = szToken;
hr = vtDenominator.ChangeType(VT_R8);
if(FAILED(hr) || (vtDenominator.vt != VT_R8) || (vtDenominator.dblVal <= 0.0))
return false;
//otherwise calculate number and return true
result = vtNumber.dblVal + vtNumerator.dblVal / vtDenominator.dblVal;
return true;
}
else
return false;
}
Thank
Comment