Funkcja konwertująca przecinek na kropkę
C (prosta zamiana in‑place – lekka i szybka)
void comma_to_dot_inplace(char *s) {
if (!s) return;
while (*s) {
if (*s == ',') *s = '.';
++s;
}
}
C (normalizacja liczby: usuwa kropki tysięcy, zamienia separator dziesiętny, waliduje podstawowe reguły, wspiera notację naukową)
#include <stdbool.h>
#include <stddef.h>
#include <ctype.h>
static bool is_thousands_dot(const char *p, bool have_dec, bool in_exp) {
// Kropka jako tysiące: przed nią cyfra, po niej dokładnie 3 cyfry i dalej nie-cyfra lub koniec.
if (have_dec || in_exp) return false;
if (!isdigit((unsigned char)p[-1])) return false;
return isdigit((unsigned char)p[1]) &&
isdigit((unsigned char)p[2]) &&
isdigit((unsigned char)p[3]) &&
!isdigit((unsigned char)p[4]);
}
bool normalize_number_pl_to_c(const char *in, char *out, size_t outsz) {
if (!in || !out || outsz == 0) return false;
size_t j = 0;
bool have_dec = false, in_exp = false, have_digit = false;
bool exp_sign_allowed = false;
// Pomijamy wiodące spacje
while (*in && isspace((unsigned char)*in)) ++in;
// Znak na początku
if (*in == '+' || *in == '-') {
if (j + 1 >= outsz) return false;
out[j++] = *in++;
}
for (; *in; ++in) {
unsigned char c = (unsigned char)*in;
if (isspace(c)) {
// pozwól na końcowe spacje, ale nic po nich
while (*in && isspace((unsigned char)*in)) ++in;
if (*in) return false; // były znaki po spacjach
break;
}
if (isdigit(c)) {
if (j + 1 >= outsz) return false;
out[j++] = (char)c;
have_digit = true;
exp_sign_allowed = false;
continue;
}
if (c == ',' || c == '.') {
if (!have_dec) {
if (c == '.' && j > 0 && in[1] && is_thousands_dot(in, have_dec, in_exp)) {
// pomiń kropkę tysięcy
continue;
}
if (j + 1 >= outsz) return false;
out[j++] = '.';
have_dec = true;
continue;
} else {
return false; // drugi separator dziesiętny
}
}
if ((c == 'e' || c == 'E') && have_digit && !in_exp) {
if (j + 1 >= outsz) return false;
out[j++] = (char)c;
in_exp = true;
exp_sign_allowed = true; // po 'e' dopuszczamy znak
have_digit = false; // wymagamy cyfr w wykładniku
continue;
}
if ((c == '+' || c == '-') && exp_sign_allowed) {
if (j + 1 >= outsz) return false;
out[j++] = (char)c;
exp_sign_allowed = false;
continue;
}
return false; // niedozwolony znak
}
if (!have_digit) return false; // brak części cyfrowej (np. zakończone na 'e')
if (j >= outsz) return false;
out[j] = '\0';
return true;
}
C (UART/strumień – normalizacja „w locie”)
int uart_getchar_normalized(void) {
int ch = uart_getchar_raw(); // funkcja zależna od platformy
if (ch == ',') ch = '.';
return ch;
}
C++ (std::string)
#include <string>
#include <algorithm>
void normalize(std::string &s) {
// usuń separatory tysięcy
for (size_t i = 1; i + 3 < s.size(); ) {
if (std::isdigit((unsigned char)s[i-1]) &&
s[i]=='.' &&
std::isdigit((unsigned char)s[i+1]) &&
std::isdigit((unsigned char)s[i+2]) &&
std::isdigit((unsigned char)s[i+3]) ) {
s.erase(i, 1);
} else {
++i;
}
}
std::replace(s.begin(), s.end(), ',', '.');
}
Python (liczby: usuń kropkę tysięcy tylko w typowym wzorcu, zamień przecinek, rzutuj)
import re
def to_float_pl(text: str) -> float:
if not isinstance(text, str):
raise TypeError("Oczekiwano str")
# usuń spacje i NBSP
s = text.replace(' ', '').replace('\u00A0', '')
# usuń kropki tysięcy: cyfra . trzy cyfry (i dalej nie-cyfra lub koniec)
s = re.sub(r'(?<=\d)\.(?=\d{3}(?!\d))', '', s)
# zamień przecinek dziesiętny
s = s.replace(',', '.')
return float(s)
Excel (bez VBA)