• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Funkcja isnumber problem

Object Storage Arubacloud
+1 głos
152 wizyt
pytanie zadane 27 grudnia 2022 w C i C++ przez piotr_domanski Bywalec (2,080 p.)
zamknięte 2 stycznia 2023 przez piotr_domanski

Witam,

Mam taką funkcję

bool isnumber( const std::string & v )
{
    for( size_t i = 0; i < v.size(); ++i )
    {
        if( v[ i ] < '0' || v[ i ] > '9' ) return false;
 
    }
    return true;
}

Ta funkcja rozpoznaje czy zostały wpisane liczby, ale jak wpiszemy liczbę z przecinkiem to wtedy funkcja nie zadziała. 

Jak zaakceptować przecinek, żeby ta funkcja dopuszczała liczby zmiennoprzecinkowe?

 

komentarz zamknięcia: rozwiązanie
komentarz 27 grudnia 2022 przez Oscar Nałogowiec (29,320 p.)
Zastanów się czy nie uwzgłednić też zapisu naukowego (tego z wykładnikiem).
komentarz 27 grudnia 2022 przez piotr_domanski Bywalec (2,080 p.)
Co masz na myśli
komentarz 27 grudnia 2022 przez VBService Ekspert (254,440 p.)

@piotr_domanski, może przez dodanie

[ on-line ]

bool isnumber( const std::string & v )
{
    bool has_decimal_point = false;
    
    for( size_t i = 0; i < v.size(); ++i )
    {
        if( v[ i ] == '.' )
        {
            if( has_decimal_point ) return false; // już znaleziono przecinek wcześniej
            has_decimal_point = true;
        }
        else if( v[ i ] < '0' || v[ i ] > '9' ) return false;
 
    }
    return true;
}

 

komentarz 28 grudnia 2022 przez Oscar Nałogowiec (29,320 p.)

@piotr_domanski,  Liczby zmiennoprzecinkowe można też podawać  z postaci np 1.234E-10.

2 odpowiedzi

+1 głos
odpowiedź 27 grudnia 2022 przez j23 Mędrzec (194,920 p.)
wybrane 2 stycznia 2023 przez piotr_domanski
 
Najlepsza

Tak na szybko:

bool isnumber( const std::string & v )
{
    char dec_point = std::use_facet<std::numpunct<char>>(std::cout.getloc()).decimal_point();
    size_t i = 0;

    while (i < v.size() && isspace(v[i])) { ++i; }
    while (i < v.size() && isdigit(v[i])) { ++i; }
    if(i == v.size()) return true;
    if(v[i] == dec_point) ++i;
    while (i < v.size() && isdigit(v[i])) { ++i; }
    while (i < v.size() && isspace(v[i])) { ++i; }
    return i == v.size();
}

 

0 głosów
odpowiedź 28 grudnia 2022 przez mokrowski Mędrzec (155,700 p.)

W trybie myślenia alternatywnego :)

#include <iostream>
#include <iomanip>
#include <string>
#include <set>
#include <algorithm>

bool is_number(const std::string& val_str) {
	static const std::set<char> nums_char{
		'0','1','2','3','4','5','6','7','8','9','.'
	};
	return std::all_of(val_str.cbegin(), val_str.cend(),
			[](char x) { return nums_char.find(x) != nums_char.cend(); });
}

int main() {
	std::string val = "12.3443";
	std::cout << std::boolalpha << val << " is number: " << is_number(val) << '\n';
}

Oczywiście brak obsługi wielu przypadków brzegowych... Tu chodziło o zachętę do zerknięcia na istniejące algorytmy i użyteczne kontenery.

Nie znaleziono podobnych pytań

92,624 zapytań

141,482 odpowiedzi

319,822 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...