The problem is the double value that string.Format transform in a string using the locale decimal separator. And if you have a locale where the decimal separator is a comma then you are ready for a big surprise.
For example, if you have
double price = 12.4;
string s = string.Format("{0}", price);
Console.WriteLine(s);
in my locale (italian) the output is
12,4
as you can see, with string concatenation this becomes a new value that is not expected by the table definition
I could point to a different overload of string.Format like this one
string.Format(CultureInfo.InvariantCulture, "{0}", price);
but this is just a way to cure the symptoms of the problem and not the real issue.
The only recommended solution to this problem is a parameterized query
string cmdText = "INSERT into Invoices values (@id, @email, @inv, @dt, @qta, @prix)";
SqlCommand cmd = new SqlCommand(cmdText, connection);
cmd.Parameters.AddWithValue("@id", currId);
cmd.Parameters.AddWithValue("@email", emailAdressCustomer);
cmd.Parameters.AddWithValue("@inv", currInvoices);
cmd.Parameters.AddWithValue("@dt", today);
cmd.Parameters.AddWithValue("@qta", quantityCart);
cmd.Parameters.AddWithValue("@pix", price);
connection.Open();
cmd.ExecuteNonQuery();
In this way, the proper handling of the decimal separator, string quotes, date formatting (and don't forget the whole Sql Injection vulnerability) is passed to the framework code that probably knows better how to do it.