-2

Js code is:

var thousand = ',';
var decimal = '.';
var decimalPlaces = 2;

function formatMoney(number, places, symbol, thousand, decimal, Alignment) {
    symbol = '$';
    number = number || 0;
    places = !isNaN(places = Math.abs(places)) ? places : 2;
    symbol = symbol !== undefined ? symbol : "$";
    if (typeof thousand == 'undefined' || thousand == null) {
        thousand = ",";
    }

    decimal = decimal || ".";
    var negative = number < 0 ? "-" : "",
        i = parseInt(number = Math.abs(+number || 0).toFixed(places), 10) + "",
        j = (j = i.length) > 3 ? j % 3 : 0;
    if (typeof Alignment != 'undefined' && Alignment != null && Alignment.toLowerCase() == "right") {

        return negative + (j ? i.substr(0, j) + thousand : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousand) + (places ? decimal + Math.abs(number - i).toFixed(places).slice(2) : "") + symbol;
    }
    else {
        return symbol + negative + (j ? i.substr(0, j) + thousand : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousand) + (places ? decimal + Math.abs(number - i).toFixed(places).slice(2) : "");
    }
}

So i want this code in C# I have tried using Parse as a replacement for isNan but i am unable to do for ||

marsze
  • 15,079
  • 5
  • 45
  • 61

3 Answers3

1

You don't need to worry about undefined as if it is your function's parameter, it is always defined otherwise compiler gives an error before running it. Javascript is different as you can define a parameter without passing anything to function. you have to say for example

 public string formatMoney(int number, string places,string  symbol,string  thousand,string  decimal,string  Alignment)

so thousand is always defined

You just need to replace :

if (typeof thousand == 'undefined' || thousand == null)

with

if(String.IsNullOrWhitespace(thousand))

if thousand is string

Nick Mehrdad Babaki
  • 11,560
  • 15
  • 45
  • 70
1

If number is a nullable (e.g. decimal?) in your C# code, you can use the null-coalescing operator as replacement for ||:

number = number ?? 0;

Since C# is a strongly typed language, you won't have to worry about any arbitrary types being passed like in JS. You can declare the places parameter as int? and then simply do:

places = places.HasValue ? Math.Abs(places.Value) : 2;

You should also mind, that there are already a lot of built-in functions for standard and custom formatting in C#, including a specific currency format specifier, so you might want to have a look at that.

Example:

static string FormatMoney(decimal number, int places, string symbol, string thousand, string @decimal, int alignment)
{  
    var nfi = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
    nfi.CurrencyGroupSeparator = thousand;
    nfi.CurrencyDecimalSeparator = @decimal;
    nfi.CurrencyDecimalDigits = places;
    nfi.CurrencySymbol = symbol;
    nfi.CurrencyPositivePattern = alignment;
    return number.ToString("C", nfi);
}

decimal value = 123456.789m;
Console.WriteLine(FormatMoney(value, 2, "$", ",", ".", 0));

// OUTPUT:
// $123,456.79
marsze
  • 15,079
  • 5
  • 45
  • 61
  • These are the types int? number, string places,string symbol,string thousand,string decimal,string Alignment – Nikhil Chaudhary Dec 06 '18 at 09:44
  • @NikhilChaudhary It depends on how you want to use the function. Please also have a look at the built-in formatting functions I've included in my answer. – marsze Dec 06 '18 at 09:46
  • Thanks for the response, but i need the converstion with help of number format like: '1.234.567,89' , '1,234,567.89', '1.234.567', etc means whatever i define in the format, it should convert like that – Nikhil Chaudhary Dec 06 '18 at 09:48
  • @NikhilChaudhary Yes that's what the formatting functions are for. – marsze Dec 06 '18 at 09:52
  • @NikhilChaudhary See my edit. That's basically exactly what you need, all with built-in functionality. Maybe not perfect yet, but will get you started. – marsze Dec 06 '18 at 10:05
  • Thanks a lot but i am having problem when we use Console.WriteLine(FormatMoney(value, 2, "$", ".", ",", 0)); It should give $123.456,79 – Nikhil Chaudhary Dec 06 '18 at 10:45
  • Ok i changed NumberGroupSeparator to nfi.CurrencyGroupSeparator = thousand; Working fine for me now thanks – Nikhil Chaudhary Dec 06 '18 at 11:02
  • @NikhilChaudhary Yea sorry, my mistake. I pieced together this function in a very short time. Also have a look at CurrencyNegativePattern and the respective values. – marsze Dec 06 '18 at 11:11
0

The || operator isn't available in C# for setting variables (I guess that's where it needs replacement). So for that you can just check the value (e.g. number = (number == null) ? 0 : number;).

For the isNaN you could create a function like:

public bool IsNumeric(string value)
{
     return value.All(char.IsNumber);
}

and use this to check if something is a number or not.

Hope this helps!

Gijs Beijer
  • 560
  • 5
  • 19