2010-09-29 13 views
7

क्या किसी को भी "पहले", "दसवां" और "एक सौवां" जैसे शब्दों को उनके अंकीय समकक्ष रूपांतरित करने के तरीके के बारे में पता है?क्या एक सामान्य संख्यात्मक स्ट्रिंग को अपने मिलान करने वाले संख्यात्मक मान में परिवर्तित करने का एक सरल तरीका है?

नमूने: "प्रथम" -> 1, "दूसरी" -> -2, "दसवें" -> 10, "सौवां" -> 100

किसी भी एल्गोरिथ्म पर्याप्त होगा, लेकिन मैं लिख रहा हूँ यह सी # में है।

संपादित

यह बहुत नहीं है और केवल एक समय में एक शब्द के साथ काम करता है लेकिन यह मेरी प्रयोजनों के सूट। शायद कोई इसे सुधार सकता है लेकिन मैं समय से बाहर हूं।

public static int GetNumberFromOrdinalString(string inputString) 
    { 
     string[] ordinalNumberWords = { "", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth" }; 
     string[] ordinalNumberWordsTens = { "", "tenth", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth" }; 
     string[] ordinalNumberWordsExtended = {"hundredth", "thousandth", "millionth", "billionth" }; 

     if (inputString.IsNullOrEmpty() || inputString.Length < 5 || inputString.Contains(" ")) return 0; 

     if (ordinalNumberWords.Contains(inputString) || ordinalNumberWordsTens.Contains(inputString)) 
     { 
      var outputMultiplier = ordinalNumberWords.Contains(inputString) ? 1 : 10; 
      var arrayToCheck = ordinalNumberWords.Contains(inputString) ? ordinalNumberWords : ordinalNumberWordsTens; 

      // Use the loop counter to get our output integer. 
      for (int x = 0; x < arrayToCheck.Count(); x++) 
      { 
       if (arrayToCheck[x] == inputString) 
       { 
        return x * outputMultiplier; 
       } 
      } 
     } 

     // Check if the number is one of our extended numbers and return the appropriate value. 
     if (ordinalNumberWordsExtended.Contains(inputString)) 
     { 
      return inputString == ordinalNumberWordsExtended[0] ? 100 : inputString == ordinalNumberWordsExtended[1] ? 1000 : inputString == ordinalNumberWordsExtended[2] ? 1000000 : 1000000000; 
     } 

     return 0; 
    } 
+0

क्या आपका मतलब है, कुछ ऐसा रूपांतरित करें : '231' से' 1 + 30 + 200'? – Ruel

+0

@Ruel, नहीं, मुझे लगता है कि ओपी का मतलब है 1 -> "पहला", 10 -> "दसवां", 100 -> "एक सौवां" –

+0

आप इसके साथ कितना उच्च जाना चाहते हैं? – BlackICE

उत्तर

2

मैंने कभी भी इतना सोचा नहीं है कि मुझे "और" शब्द को पूरी संख्या से दशमलव तक संक्रमण माना जाता है। जैसा

एक सौ नब्बे नौ डॉलर और दस सेंट

एक सौ नब्बे नौ डॉलर नहीं।

वैसे भी किसी भी संभावित समाधान को इनपुट स्ट्रिंग को पार्स करना होगा, कोई अपवाद उठाएं या अन्यथा मूल्य वापस कर देना होगा।

लेकिन पहले आप को पता होगा "नियम" यह बहुत मनमाना और परंपरा पर आधारित प्रतीत हो रहा है, लेकिन इस सज्जन शुरू करने के लिए किसी भी रूप में रूप में अच्छा एक जगह लगता है:

Ask Dr. Math

+0

यदि आप इसे एक नियम बनाते हैं कि "और" केवल संक्रमण के लिए संक्रमण में उपयोग किया जाता है तो जब आप अपने सॉफ्टवेयर को पुरानी दुनिया में बेचने का प्रयास करते हैं तो आपके पास समस्या का पूरा ढेर होगा! यहां ब्रिटेन में हम आम तौर पर "एक सौ और एक पाउंड और उन्नीस पेंस" कहते हैं, या यहां तक ​​कि "मेरे जन्मदिन तक दो सौ छः दिन" - "एक सौ एक" हमारे लिए बहुत अमेरिकी लगता है। – AAT

+0

यूप, मनमानी और परंपरा आधार। महान भाषा बीटीडब्ल्यू के लिए धन्यवाद। हमें केवल इसमें कुछ बदलाव करना पड़ा। :-) –

0

मुझे लगता है कि आप अधिकतम सीमा तक मूल्यों के लिए तारों को मैप करने के लिए समाप्त हो सकते हैं और फिर क्रम में स्ट्रिंग को पार्स कर सकते हैं और मानों को इस प्रकार रख सकते हैं। चूंकि परिमाण के क्रम में और बहुत कम नियमित नामकरण सम्मेलन है, इसलिए मुझे नहीं लगता कि इसके अंकीय मूल्य प्राप्त करने के लिए किसी शब्द को पार्स करने का एक सुरुचिपूर्ण या आसान तरीका है। सौभाग्य से, प्रारूप के आधार पर, आपको शायद केवल परिमाण के हर क्रम को मानचित्र बनाना होगा। उदाहरण के लिए, यदि आप केवल 0-100 की संख्या की अपेक्षा करते हैं और उन्हें "नब्बे-नौ" के रूप में इनपुट किया जाता है तो आपको केवल 0-9, 10-1200 के चरणों में 10-100 मैप करना होगा।

संबंधित मुद्दे

 संबंधित मुद्दे