Mam ciąg "1112224444" to numer telefonu. Chcę sformatować jako 111-222-4444 przed zapisaniem go w pliku. Jest na kablu danych i wolałbym móc to zrobić bez przypisywania nowego zmienna.
Myślałem:
String.Format("{0:###-###-####}", i["MyPhone"].ToString() );
ale to chyba nie pomaga.
** AKTUALIZACJA **
Dobrze. Poszedłem z tym rozwiązaniem
Convert.ToInt64(i["Customer Phone"]).ToString("###-###-#### ####")
Teraz robi się pomieszane, gdy rozszerzenie ma mniej niż 4 cyfry. Wypełni liczby z prawej strony. więc
1112224444 333 becomes
11-221-244 3334
Jakieś pomysły?
c#
string
formatting
phone-number
Brian G.
źródło
źródło
Odpowiedzi:
Pamiętaj, że ta odpowiedź działa z numerycznymi typami danych (int, long). Jeśli zaczynasz od ciągu, musisz najpierw przekonwertować go na liczbę. Weź również pod uwagę, że musisz sprawdzić, czy początkowy ciąg ma co najmniej 10 znaków długości.
Z dobrej strony pełnej przykładów:
Chociaż wyrażenie regularne może działać jeszcze lepiej, pamiętaj o starym cytacie z programowania:
źródło
Wolę używać wyrażeń regularnych:
źródło
// Remove non-digit characters var phoneDigits = Regex.Replace(crewMember.CellPhone, "[^\\d]", string.Empty); // Format the digits var phone = Regex.Replace(phoneDigits, @"(\d{1,3})(\d{0,3})(\d{0,4})", " ($1) $2-$3");
Będziesz musiał rozbić go na podciągi. Chociaż można to zrobić bez dodatkowych zmiennych, nie byłoby to szczególnie przyjemne. Oto jedno potencjalne rozwiązanie:
źródło
if (phone.Length == 10)
stan.Proponuję to jako czyste rozwiązanie dla numerów w USA.
źródło
O ile wiem, nie możesz tego zrobić za pomocą string.Format ... sam musiałbyś sobie z tym poradzić. Możesz po prostu usunąć wszystkie znaki nienumeryczne, a następnie zrobić coś takiego:
Zakłada się, że dane zostały wprowadzone poprawnie, co można sprawdzić za pomocą wyrażeń regularnych.
źródło
To powinno działać:
LUB w twoim przypadku:
źródło
Jeśli możesz uzyskać
i["MyPhone"]
jako pliklong
, możesz użyćlong.ToString()
metody, aby go sformatować:Zobacz stronę MSDN dotyczącą ciągów formatujących liczb .
Uważaj, aby użyć long zamiast int: int może się przepełnić.
źródło
2125551-212-1234.
źródło
Jeśli szukasz numeru telefonu (w USA) do konwersji w czasie rzeczywistym. Sugeruję użycie tego rozszerzenia. Ta metoda działa doskonale bez wpisywania liczb od tyłu. Wydaje się, że
String.Format
rozwiązanie działa wstecz. Po prostu zastosuj to rozszerzenie do swojego ciągu.źródło
Możesz także spróbować tego:
Wynik:
źródło
Możesz znaleźć się w sytuacji, w której użytkownicy próbują wprowadzać numery telefonów z różnego rodzaju separatorami między numerem kierunkowym a głównym blokiem numerycznym (np. Spacje, myślniki, kropki itp.). usuń wszystkie znaki, które nie są liczbami, aby móc wysterylizować dane wejściowe, z którymi pracujesz. Najłatwiej to zrobić za pomocą wyrażenia RegEx.
Wtedy odpowiedź, którą podałeś, powinna działać w większości przypadków.
Aby odpowiedzieć na to, co masz na temat problemu z numerem wewnętrznym, możesz usunąć wszystko, co jest dłuższe niż oczekiwana długość dziesięciu (w przypadku zwykłego numeru telefonu), i dodać to na końcu, używając
Będziesz chciał sprawdzić `` jeśli '', aby określić, czy długość danych wejściowych jest większa niż 10, zanim to zrobisz, jeśli nie, po prostu użyj:
źródło
źródło
źródło
Spróbuj tego
Twoje zdrowie.
źródło
Użyj funkcji Dopasuj w wyrażeniu regularnym, aby podzielić, a następnie wyślij sformatowany ciąg z match.groups
źródło
Poniższe działania będą działać bez użycia wyrażeń regularnych
Jeśli nie użyjemy long.Parse, string.format nie będzie działać.
źródło
Wynik będzie: 001-568-895623
źródło
Użyj poniższego linku dla C # http://www.beansoftware.com/NET-Tutorials/format-string-phone-number.aspx
Najłatwiejszym sposobem formatowania jest użycie Regex.
Podaj swój numer telefonu jako ciąg 2021231234 do 15 znaków.
Innym podejściem byłoby użycie podłańcucha
źródło
Aby rozwiązać problem z rozszerzeniem, wykonaj następujące czynności:
źródło
Nie żeby wskrzesić starego pytania, ale doszedłem do wniosku, że mogę zaoferować przynajmniej nieco łatwiejszą w użyciu metodę, jeśli konfiguracja będzie nieco bardziej skomplikowana.
Więc jeśli utworzymy nowy niestandardowy program formatujący, możemy użyć prostszego formatowania
string.Format
bez konieczności konwertowania naszego numeru telefonu nalong
Więc najpierw utwórzmy niestandardowy program formatujący:
Więc jeśli chcesz tego użyć, zrób coś takiego:
Kilka innych rzeczy do przemyślenia:
W tej chwili, jeśli określiłeś dłuższy program formatujący niż ciąg do formatowania, po prostu zignoruje dodatkowe znaki #. Na przykład this
String.Format(new NumericStringFormatter(),"{0:###-###-####}", "12345");
dałoby 123-45-, więc możesz chcieć, aby pobierał jakiś możliwy znak wypełniacza w konstruktorze.Nie zapewniłem również sposobu na uniknięcie znaku #, więc gdybyś chciał uwzględnić to w swoim ciągu wyjściowym, nie byłbyś w stanie tak, jak jest teraz.
Powodem, dla którego wolę tę metodę od Regex, jest to, że często mam wymagania, aby pozwolić użytkownikom na samodzielne określanie formatu i znacznie łatwiej jest mi wyjaśnić, jak używać tego formatu, niż próbować nauczyć użytkownika wyrażenia regularnego.
Również nazwa klasy jest trochę myląca, ponieważ w rzeczywistości działa przy formatowaniu dowolnego ciągu, o ile chcesz zachować go w tej samej kolejności i po prostu wstawić do niego znaki.
źródło
Możesz spróbować {0: (000) 000 - ####}, jeśli liczba docelowa zaczyna się od 0.
źródło
Oto inny sposób na zrobienie tego.
źródło