#include "stdafx.h"
#include <iostream>
#include<stdio.h>
#include <string>
#include<cctype>
#include<stdlib.h>
#include<fstream>
#include<iterator>
#include<list>
#include <functional>
#include <algorithm>
#include<vector>
using namespace std;
class sample
{
public:
static auto checkForCurrency = [](char *&prevPtr, char *&p)->bool
{
char *origPrevPtr = prevPtr;
char *origPtr = p;
static const unsigned char CentSymbol = 155;
static const unsigned char PoundSymbol = 156;
static const unsigned char YenYuanSymbol = 157;
bool retVal = false;
if (*p == '$' || *p == '€' || *p == '£' || *p == '¥' || *p == '¢') {
advance(prevPtr, p, 1);
if (isNumber(prevPtr, p)) {
retVal = true;
} else if (*p == TheSpace) {
char *tmpPtr = p;
advance(prevPtr, p, 1);
if (isNumber(prevPtr, p)) {
retVal = true;
} else {
p = tmpPtr;
}
}
} else if(isNumber(prevPtr, p)) {
if (*p == CentSymbol) {
advance(prevPtr, p, 1);
retVal = true;
} else if (isCurrency(prevPtr, p)) {
retVal = true;
} else if (*p == TheSpace) {
char *tmpPtr = p;
advance(prevPtr, p, 1);
if (*p == CentSymbol) {
advance(prevPtr, p, 1);
retVal = true;
} else if(isCurrency(prevPtr, p)) {
retVal = true;
} else {
p = tmpPtr;
}
}
}
if (retVal) {
memset(origPtr, TheSpace, p - origPtr);
*(origPtr + 0) = '#';
*(origPtr + 1) = 'c';
} else {
prevPtr = origPrevPtr;
p = origPtr;
}
return retVal;
};
static auto isCurrency = [](char *&prevPtr, char *&p)->bool
{
static const string currencies[] = { "dollars", "dollar", "cents", "cent",
"euros", "euro", "yen", "yuan", "pounds", "pound", "pence",
"usd", "eur", "aud", "cad", "cny",
};
for (const string ¤cy : currencies) {
const string::size_type lenCurrency = currency.length();
if (strncmp(p, currency.c_str(), lenCurrency) == 0) {
if (*prevPtr == TheSpace) {
char *const pEndOfCurrency = p + lenCurrency;
if (*pEndOfCurrency == TheSpace) {
advance(prevPtr, p, lenCurrency);
return true;
}
}
}
}
return false;
};
static auto isNumber = [](char *&prevPtr, char *&p)->bool
{
bool retVal = false;
if (*p == '-' || *p == '+') {
advance(prevPtr, p, 1);
if (isDigit(prevPtr, p)) {
retVal = true;
for (;;) {
while (isDigit(prevPtr, p)) {}
if (*p == ',') {
advance(prevPtr, p, 1);
continue;
}
break;
}
if (*p == '.') {
advance(prevPtr, p, 1);
while (isDigit(prevPtr, p)) {}
if (*p == 'e') {
advance(prevPtr, p, 1);
if (*p == '-' || *p == '+') {
advance(prevPtr, p, 1);
}
while (isDigit(prevPtr, p)) {}
}
} else if (*p == 'e') {
advance(prevPtr, p, 1);
if (*p == '-' || *p == '+') {
advance(prevPtr, p, 1);
}
while (isDigit(prevPtr, p)) {}
} else if (*p == '/') { advance(prevPtr, p, 1);
for (;;) {
while (isDigit(prevPtr, p)) {}
if (*p == ',') {
advance(prevPtr, p, 1);
continue;
}
break;
}
}
}
} else if (isDigit(prevPtr, p)) {
retVal = true;
for (;;) {
while (isDigit(prevPtr, p)) {}
if (*p == ',') {
advance(prevPtr, p, 1);
continue;
}
break;
}
if (*p == '.') {
advance(prevPtr, p, 1);
while (isDigit(prevPtr, p)) {}
if (*p == 'e') {
advance(prevPtr, p, 1);
if (*p == '-' || *p == '+') {
advance(prevPtr, p, 1);
}
while (isDigit(prevPtr, p)) {}
}
} else if (*p == 'e') {
advance(prevPtr, p, 1);
if (*p == '-' || *p == '+') {
advance(prevPtr, p, 1);
}
while (isDigit(prevPtr, p)) {}
} else if (*p == '/') { advance(prevPtr, p, 1);
for (;;) {
while (isDigit(prevPtr, p)) {}
if (*p == ',') {
advance(prevPtr, p, 1);
continue;
}
break;
}
}
}
return retVal;
};
static auto advance = [](char *&prevPtr, char *&p, const size_t offset)->void
{
if (offset == 0) return; prevPtr = p + (offset - 1);
p = prevPtr + 1;
};
static auto isDigit = [](char *&prevPtr, char *&p)->bool
{
if (*p >= '0' && *p <= '9') { advance(prevPtr, p, 1);
return true;
}
return false;
};
};
int main()
{
sample smpl;
smpl.checkForCurrency = [](char *&prevPtr, char *&p)->bool;
smpl.isCurrency = [](char *&prevPtr, char *&p)->bool;
smpl.isNumber = [](char *&prevPtr, char *&p)->bool;
smpl.advance = [](char *&prevPtr, char *&p, const size_t offset)->void;
smpl. isDigit = [](char *&prevPtr, char *&p)->bool;
cin.ignore();
system("pause");
return 0;
}