class DigitClass { public: String number; int point, diff; bool minus; long digit[2]; // 8桁 x 2 long long acc; // 16桁だけ利用する uint8_t dispError; // 数字の文字列登録(16文字以内) void setFigure(String num) { int po = 0; int len; number = num; number.trim(); // 空白を取り除く // マイナスの確認 if(number[0] == '-') { number.remove(0, 1); minus = true; } else minus = false; len = number.length(); // 小数点の位置確認 po = number.indexOf('.'); if(po == -1) point = 0; else { point = len - po - 1; // 小数点削除 number.remove(po, 1); } } // 数字の文字列を整数に変換 bool setNumber(bool adjust) { int count, len; char n[10]; if(adjust) { // 小数点をずらした後に必要な0の数 for(int i=0; i 16) return false; } else len = number.length(); // Arduinoのライブラリがlong longに対応していないので // いったん8桁の整数x2に変換してから16桁の整数にする count = len - 1; for(int i=7; i>=0; i--) { if(count < 0) n[i] = '0'; else n[i] = number[count]; //下の桁から代入 --count; } digit[1] = atol(n); for(int i=7; i>=0; i--) { if(count < 0) n[i] = '0'; else n[i] = number[count]; //下の桁から代入 --count; } digit[0] = atol(n); // 16桁の整数に変換 acc = digit[0]; acc *= 100000000; // こうしないと正しく代入できない acc += digit[1]; if(minus) acc = -acc; return true; } // 数値を文字列に変換 char* getString() { long long quo; int sur, maxlen; static char buff[25]; int len, count, index; bool zero; if(acc == 0) { sprintf(buff, "0"); return buff; } else if(acc < 0) { acc = -acc; minus = true; maxlen = 15; } else { minus = false; maxlen = 16; } for(int i=0; i<25; i++) buff[i] = NULL; quo = acc; index = 23; while(true) { sur = quo % 10; buff[index--] = sur + '0'; quo /= 10; if(quo == 0) break; } for(int i=0; i<25; i++) { if(buff[i] != NULL) { index = i; break; } } for(int i=0; i<25-index; i++) buff[i] = buff[i + index]; len = strlen(buff); if(point) // 小数点あり { if(len > point) { count = point + 1; // 小数点の桁数+終端文字 index = len; // 文字数+終端文字 while(true) { buff[index + 1] = buff[index]; // 1文字後ろへずらす if(--count == 0) // 小数点位置 { buff[index] = '.'; break; } --index; } } else { count = point - len + 2; // "0."で2文字追加 for(int i=len-1; i>=0; i--) buff[i + count] = buff[i]; // count文字数ずらす buff[0] = '0'; buff[1] = '.'; for(int i=2; i maxlen) // 画面におさまらない { index = len - point; if(index < maxlen) // 整数部が画面内におさまるか { // 小数切り捨てで.000…0になっていないか zero = true; for(int i=index; i maxlen) // 画面におさまらない { buff[0] = NULL; // 表示エラー return buff; } } //マイナスの処理 if(minus) { for(int i=len; i>=0; i--) // 文字数+終端 buff[i + 1] = buff[i]; // 1文字ずらす buff[0] = '-'; } return buff; } };